tars2c.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #include "tars2c.h"
  17. #include "util/tc_md5.h"
  18. #include "util/tc_file.h"
  19. #include "util/tc_common.h"
  20. #include <string>
  21. #define TAB g_parse->getTab()
  22. #define INC_TAB g_parse->incTab()
  23. #define DEL_TAB g_parse->delTab()
  24. //////////////////////////////////////////////////////////////////////////////////
  25. //
  26. string Tars2C::writeTo(const TypeIdPtr &pPtr,const string& namespaceId) const
  27. {
  28. ostringstream s;
  29. StructPtr sPtr = StructPtr::dynamicCast(pPtr->getTypePtr());
  30. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr->getTypePtr());
  31. MapPtr mPtr = MapPtr::dynamicCast(pPtr->getTypePtr());
  32. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  33. {
  34. s << TAB << "ret = TarsOutputStream_writeInt32(os, (Int32)tars_st->" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  35. }
  36. else if (toClassName(VectorPtr::dynamicCast(pPtr->getTypePtr())) == "list<char>" )
  37. {
  38. s << TAB << "ret = TarsOutputStream_writeVectorChar(os, tars_st->" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  39. }
  40. else if (sPtr)
  41. {
  42. s << TAB << "ret = TarsOutputStream_writeStruct(os, tars_st->" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  43. }
  44. else if (m_bCheckDefault == false || pPtr->isRequire() || (!pPtr->hasDefault() && !mPtr && !vPtr))
  45. {
  46. s << TAB << "ret = TarsOutputStream_write" << toFuncName(pPtr->getTypePtr()) << "(os, tars_st->" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  47. }
  48. else
  49. {
  50. std::string sCheckCond = "true";
  51. if (mPtr)
  52. {
  53. sCheckCond = "JMapWrapper_size(tars_st->" + pPtr->getId() + ") > 0";
  54. }
  55. if (vPtr)
  56. {
  57. sCheckCond = "JArray_size(tars_st->" + pPtr->getId() + ") > 0";
  58. }
  59. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  60. if (bPtr && bPtr->kind() == Builtin::KindString && pPtr->hasDefault())
  61. {
  62. string tmp = tars::TC_Common::replace(pPtr->def(), "\"", "\\\"");
  63. sCheckCond = "JString_size(tars_st->" + pPtr->getId() + ") != strlen(\"" + tmp + "\") || strncmp(JString_data(tars_st->" + pPtr->getId() + "), \"" + tmp + "\", JString_size(tars_st->" + pPtr->getId() + ")) != 0";
  64. }
  65. else if (pPtr->hasDefault())
  66. {
  67. sCheckCond = "tars_st->" + pPtr->getId() + " != " + pPtr->def();
  68. }
  69. s << TAB << "if (" << sCheckCond << ")" << endl;
  70. s << TAB << "{" << endl;
  71. INC_TAB;
  72. s << TAB << "ret = TarsOutputStream_write" << toFuncName(pPtr->getTypePtr()) << "(os, tars_st->" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  73. DEL_TAB;
  74. s << TAB << "}" << endl;
  75. }
  76. s << TAB <<"if (TARS_SUCCESS != ret) return ret;" << endl;
  77. s <<endl;
  78. return s.str();
  79. }
  80. string Tars2C::readFrom(const TypeIdPtr &pPtr, bool bIsRequire,const string& namespaceId) const
  81. {
  82. ostringstream s;
  83. bool isPtr = false;
  84. string type = toFuncName(pPtr->getTypePtr());
  85. StructPtr sPtr = StructPtr::dynamicCast(pPtr->getTypePtr());
  86. if (type == "String" || type == "Vector" || type == "Map" || type == "Struct")
  87. {
  88. isPtr = true;
  89. }
  90. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  91. {
  92. s << TAB << "ret = TarsInputStream_readInt32(is, & tars_st->" << pPtr->getId();
  93. }
  94. else if (toClassName(VectorPtr::dynamicCast(pPtr->getTypePtr())) == "list<char>" )
  95. {
  96. s << TAB << "ret = TarsInputStream_readVectorChar(is, tars_st->" << pPtr->getId();
  97. }
  98. else if (sPtr)
  99. {
  100. s << TAB << "ret = TarsInputStream_readStruct(is, tars_st->" << pPtr->getId();
  101. }
  102. else
  103. {
  104. s << TAB << "ret = TarsInputStream_read" << toFuncName(pPtr->getTypePtr()) << "(is, "<< (isPtr ? "" : "&") <<"tars_st->" << pPtr->getId();
  105. }
  106. s << ", " << pPtr->getTag() << ", " << ((pPtr->isRequire() && bIsRequire)?"true":"false") << ");"<<endl;
  107. s << TAB<<"if(TARS_SUCCESS != ret) return ret;" << endl;
  108. return s.str();
  109. }
  110. string Tars2C::toClassName(const TypePtr &pPtr) const
  111. {
  112. string s;
  113. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  114. if (bPtr)
  115. {
  116. switch (bPtr->kind())
  117. {
  118. case Builtin::KindBool: s = "bool"; break;
  119. case Builtin::KindByte: s = "char"; break;
  120. case Builtin::KindShort: s = "short"; break;
  121. case Builtin::KindInt: s = "int32"; break;
  122. case Builtin::KindLong: s = "int64"; break;
  123. case Builtin::KindFloat: s = "float"; break;
  124. case Builtin::KindDouble: s = "double"; break;
  125. case Builtin::KindString: s = "string"; break;
  126. default: assert(false); break;
  127. }
  128. return s;
  129. }
  130. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  131. if (vPtr) return tostrVector(vPtr);
  132. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  133. if (mPtr) return tostrMap(mPtr);
  134. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  135. if (sPtr) return TC_Common::replace(sPtr->getSid(), "::", ".");
  136. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  137. if (ePtr) return tostrEnum(ePtr);
  138. if (!pPtr) return "void";
  139. assert(false);
  140. return "";
  141. }
  142. string Tars2C::toFuncName(const TypePtr &pPtr) const
  143. {
  144. string s;
  145. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  146. if (bPtr)
  147. {
  148. switch (bPtr->kind())
  149. {
  150. case Builtin::KindBool: s = "Bool"; break;
  151. case Builtin::KindByte: s = "Char"; break;
  152. case Builtin::KindShort: s = bPtr->isUnsigned()?"UInt8" :"Short"; break;
  153. case Builtin::KindInt: s = bPtr->isUnsigned()?"UInt16":"Int32"; break;
  154. case Builtin::KindLong: s = bPtr->isUnsigned()?"UInt32":"Int64"; break;
  155. case Builtin::KindFloat: s = "Float"; break;
  156. case Builtin::KindDouble: s = "Double"; break;
  157. case Builtin::KindString: s = "String"; break;
  158. default: assert(false); break;
  159. }
  160. return s;
  161. }
  162. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  163. if (vPtr) return "Vector";
  164. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  165. if (mPtr) return "Map";
  166. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  167. if (sPtr) return "Struct";
  168. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  169. if (ePtr) return tostrEnum(ePtr);
  170. if (!pPtr) return "void";
  171. assert(false);
  172. return "";
  173. }
  174. /*******************************BuiltinPtr********************************/
  175. string Tars2C::tostr(const TypePtr &pPtr) const
  176. {
  177. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  178. if (bPtr) return tostrBuiltin(bPtr);
  179. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  180. if (vPtr)
  181. {
  182. if (toClassName(vPtr) == "list<char>")
  183. return "JString * ";
  184. else
  185. return "JArray * ";
  186. }
  187. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  188. if (mPtr) return "JMapWrapper * ";
  189. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  190. if (sPtr) return tostrStruct(sPtr)+ " *";
  191. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  192. if (ePtr) return "Int32";
  193. if (!pPtr) return "void";
  194. assert(false);
  195. return "";
  196. }
  197. string Tars2C::tostrBuiltin(const BuiltinPtr &pPtr) const
  198. {
  199. string s;
  200. switch (pPtr->kind())
  201. {
  202. case Builtin::KindBool:
  203. s = "Bool";
  204. break;
  205. case Builtin::KindByte:
  206. s = "Char";
  207. break;
  208. case Builtin::KindShort:
  209. s = (pPtr->isUnsigned()?"UInt8":"Short");
  210. break;
  211. case Builtin::KindInt:
  212. s = (pPtr->isUnsigned()?"UInt16":"Int32");
  213. break;
  214. case Builtin::KindLong:
  215. s = (pPtr->isUnsigned()?"UInt32":"Int64");
  216. break;
  217. case Builtin::KindFloat:
  218. s = "Float";
  219. break;
  220. case Builtin::KindDouble:
  221. s = "Double";
  222. break;
  223. case Builtin::KindString:
  224. s = "JString * ";
  225. break;
  226. default:
  227. assert(false);
  228. break;
  229. }
  230. return s;
  231. }
  232. /*******************************VectorPtr********************************/
  233. string Tars2C::tostrVector(const VectorPtr &pPtr) const
  234. {
  235. string s = string("list<") + toClassName(pPtr->getTypePtr());
  236. if (MapPtr::dynamicCast(pPtr->getTypePtr()) || VectorPtr::dynamicCast(pPtr->getTypePtr()))
  237. {
  238. s += " >";
  239. }
  240. else
  241. {
  242. s += ">";
  243. }
  244. return s;
  245. }
  246. /*******************************MapPtr********************************/
  247. string Tars2C::tostrMap(const MapPtr &pPtr) const
  248. {
  249. string s = string("map<") + toClassName(pPtr->getLeftTypePtr()) + "," + toClassName(pPtr->getRightTypePtr());
  250. if (MapPtr::dynamicCast(pPtr->getRightTypePtr()) || VectorPtr::dynamicCast(pPtr->getRightTypePtr()))
  251. {
  252. s += ">";
  253. }
  254. else
  255. {
  256. s += ">";
  257. }
  258. return s;
  259. }
  260. /*******************************StructPtr********************************/
  261. string Tars2C::tostrStruct(const StructPtr &pPtr) const
  262. {
  263. return TC_Common::replace(pPtr->getSid(), "::", "_");
  264. }
  265. string Tars2C::MD5(const StructPtr &pPtr) const
  266. {
  267. string s;
  268. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  269. for (size_t j = 0; j < member.size(); j++)
  270. {
  271. s += "_" + tostr(member[j]->getTypePtr());
  272. }
  273. return "\"" + tars::TC_MD5::md5str(s) + "\"";
  274. }
  275. /////////////////////////////////////////////////////////////////////
  276. string Tars2C::tostrEnum(const EnumPtr &pPtr) const
  277. {
  278. return TC_Common::replace(pPtr->getSid(), "::", "_");
  279. }
  280. ///////////////////////////////////////////////////////////////////////
  281. string Tars2C::generateH(const StructPtr &pPtr, const string& namespaceId) const
  282. {
  283. ostringstream s;
  284. string sStructName = namespaceId + "_" + pPtr->getId();
  285. s << TAB << "typedef struct " << sStructName << " " << sStructName << ";" << endl;
  286. s << TAB << "struct " << sStructName << endl;
  287. s << TAB << "{" << endl;
  288. //s << TAB << "public:" << endl;
  289. INC_TAB;
  290. s << TAB << "char * className;" << endl;
  291. s << TAB << "Int32 (*writeTo)( const "<<sStructName<<"*, TarsOutputStream *);" << endl;
  292. s << TAB << "Int32 (*readFrom)( "<<sStructName<<"*, TarsInputStream *);" << endl;
  293. // 定义成员变量
  294. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  295. for (size_t j = 0; j < member.size(); j++)
  296. {
  297. s << TAB << tostr(member[j]->getTypePtr()) << " " << member[j]->getId() << ";" << endl;
  298. }
  299. s << endl;
  300. DEL_TAB;
  301. s << TAB << "};" << endl;
  302. s << endl;
  303. ////////////////////////////////////////////////////////////
  304. s << TAB << "Int32 " << sStructName << "_writeTo(const " << sStructName << "* tars_st, TarsOutputStream * os);" << endl;
  305. s << TAB << "Int32 " << sStructName << "_readFrom(" << sStructName << "* tars_st, TarsInputStream *is);" << endl;
  306. s << TAB << "void " << sStructName << "_del(" << sStructName << " ** handle);" << endl;
  307. s << TAB << "Int32 " << sStructName << "_init(" << sStructName << " * handle);" << endl;
  308. s << TAB << sStructName << " * " << sStructName << "_new(void);" << endl;
  309. s << TAB <<endl;
  310. return s.str();
  311. }
  312. ///////////////////////////////////////////////////////////////////////
  313. string Tars2C::generateC(const StructPtr &pPtr, const string& namespaceId) const
  314. {
  315. ostringstream s;
  316. string sStructName = namespaceId + "_" + pPtr->getId();
  317. // 定义成员变量
  318. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  319. ////////////////////////////////////////////////////////////
  320. s << TAB << "Int32 " << sStructName << "_writeTo(const " << sStructName << "* tars_st, TarsOutputStream * os)" << endl;
  321. s << TAB << "{" << endl;
  322. INC_TAB;
  323. s << TAB << "Int32 ret=0;" << endl;
  324. for (size_t j = 0; j < member.size(); j++)
  325. {
  326. s << writeTo(member[j],namespaceId);
  327. }
  328. s << endl;
  329. s << TAB << "return TARS_SUCCESS;" << endl;
  330. DEL_TAB;
  331. s << TAB << "}" << endl;
  332. ///////////////////////////////////////////////////////////
  333. s << endl;
  334. s << TAB << "Int32 " << sStructName << "_readFrom(" << sStructName << "* tars_st, TarsInputStream *is)" << endl;;
  335. s << TAB << "{" << endl;
  336. INC_TAB;
  337. s << TAB << "Int32 ret=0;" << endl;
  338. for (size_t j = 0; j < member.size(); j++)
  339. {
  340. s << readFrom(member[j],true,namespaceId);
  341. }
  342. s << endl;
  343. s << TAB << "return TARS_SUCCESS;" << endl;
  344. DEL_TAB;
  345. s << TAB << "}" << endl;
  346. s << endl;
  347. s << TAB << "void " << sStructName << "_del(" << sStructName << " ** handle)" << endl;
  348. s << TAB << "{" << endl;
  349. INC_TAB;
  350. s << TAB << sStructName << " ** this = (" << sStructName << "**)handle;" << endl;
  351. for (size_t j = 0; j < member.size(); j++)
  352. {
  353. string type = toFuncName(member[j]->getTypePtr());
  354. if (type == "String")
  355. s << TAB << "if((*this)->" << member[j]->getId() << ") JString_del(&(*this)->" << member[j]->getId() << ");" << endl;
  356. else if (type == "Vector")
  357. if (toClassName(member[j]->getTypePtr()) == "list<char>")
  358. s << TAB << "if((*this)->" << member[j]->getId() << ") JString_del(&(*this)->" << member[j]->getId() << ");" << endl;
  359. else
  360. s << TAB << "if((*this)->" << member[j]->getId() << ") JArray_del(&(*this)->" << member[j]->getId() << ");" << endl;
  361. else if (type == "Map")
  362. s << TAB << "if((*this)->" << member[j]->getId() << ") JMapWrapper_del(&(*this)->" << member[j]->getId() << ");" << endl;
  363. else if (type == "Struct")
  364. {
  365. StructPtr sPtr = StructPtr::dynamicCast(member[j]->getTypePtr());
  366. if (sPtr)
  367. s << TAB << "if((*this)->" << member[j]->getId() << ") "<< namespaceId + "_" + sPtr->getId()<<"_del(&(*this)->" << member[j]->getId() << ");" << endl;
  368. }
  369. }
  370. s << TAB << "if((*this)->className) TarsFree((*this)->className);" << endl;
  371. s << TAB << "TarsFree(*this);" << endl;
  372. s << TAB << "*this = NULL;" << endl;
  373. DEL_TAB;
  374. s << TAB << "}" << endl;
  375. s << endl;
  376. s << TAB << "Int32 " << sStructName << "_init(" << sStructName << " * handle)" << endl;
  377. s << TAB << "{" << endl;
  378. INC_TAB;
  379. s << TAB << sStructName << " * this = (" << sStructName << "*) handle;" << endl;
  380. s << endl;
  381. s << TAB << "char * tarsClassName = \"" << namespaceId << "." << pPtr->getId() << "\";" << endl;
  382. s << endl;
  383. s << TAB << "this->className = TarsMalloc(strlen(tarsClassName)+1);" << endl;
  384. s << TAB << "this->writeTo = "<< sStructName << "_writeTo;" <<endl;
  385. s << TAB << "this->readFrom = "<< sStructName << "_readFrom;" << endl;
  386. s << endl;
  387. string sCleanCondition = "!this->className ";
  388. for (size_t j = 0; j < member.size(); j++)
  389. {
  390. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[j]->getTypePtr());
  391. // stringֵ 值要转义
  392. if (bPtr && bPtr->kind() == Builtin::KindString)
  393. {
  394. s << TAB << "this->" << member[j]->getId() << " = JString_new();" << endl;
  395. sCleanCondition += " || !this->" + member[j]->getId();
  396. continue;
  397. }
  398. VectorPtr vPtr = VectorPtr::dynamicCast(member[j]->getTypePtr());
  399. if (vPtr)
  400. {
  401. if (toClassName(vPtr) == "list<char>")
  402. {
  403. s << TAB << "this->" << member[j]->getId() << " = JString_new();" << endl;
  404. sCleanCondition += " || !this->" + member[j]->getId();
  405. }
  406. else
  407. {
  408. s << TAB << "this->" << member[j]->getId() << " = JArray_new(\""
  409. << toClassName(vPtr->getTypePtr()) << "\");" << endl;
  410. sCleanCondition += " || !this->" + member[j]->getId();
  411. }
  412. continue;
  413. }
  414. MapPtr mPtr = MapPtr::dynamicCast(member[j]->getTypePtr());
  415. if (mPtr)
  416. {
  417. s << TAB << "this->" << member[j]->getId() << " = JMapWrapper_new(\""
  418. << toClassName(mPtr->getLeftTypePtr()) << "\", \"" << toClassName(mPtr->getRightTypePtr()) << "\");" << endl;
  419. sCleanCondition += " || !this->" + member[j]->getId();
  420. continue;
  421. }
  422. StructPtr sPtr = StructPtr::dynamicCast(member[j]->getTypePtr());
  423. if (sPtr)
  424. {
  425. s << TAB << "this->" << member[j]->getId() << " = "<< namespaceId + "_" + sPtr->getId()+"_new();" << endl;
  426. sCleanCondition += " || !this->" + member[j]->getId();
  427. continue;
  428. }
  429. if (tostr(member[j]->getTypePtr()) == "Int64")
  430. {
  431. s << "#ifdef __MTK_64"<<endl;
  432. s << TAB << "this->" << member[j]->getId() << ".high = " << member[j]->def() << ";" << endl;
  433. s << TAB << "this->" << member[j]->getId() << ".low = " << member[j]->def() << ";" << endl;
  434. s << "#else"<<endl;
  435. s << TAB << "this->" << member[j]->getId() << " = " << member[j]->def() << ";" << endl;
  436. s << "#endif"<<endl;
  437. continue;
  438. }
  439. if (member[j]->hasDefault())
  440. {
  441. s << TAB << "this->" << member[j]->getId() << " = " << member[j]->def() << ";" << endl;
  442. }
  443. }
  444. s << endl;
  445. s << TAB << "if(" << sCleanCondition << ")" << endl;
  446. s << TAB << "{"<<endl;
  447. INC_TAB;
  448. s << TAB << sStructName << "_del(&this);"<<endl;
  449. s << TAB << "return TARS_MALLOC_ERROR;"<<endl;
  450. DEL_TAB;
  451. s << TAB <<"}" << endl;
  452. s << TAB << "memcpy(this->className, tarsClassName, strlen(tarsClassName)+1);" << endl;
  453. s << endl;
  454. //string default
  455. for (size_t j = 0; j < member.size(); j++)
  456. {
  457. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[j]->getTypePtr());
  458. // string 值要转义
  459. if (bPtr && bPtr->kind() == Builtin::KindString)
  460. {
  461. if (member[j]->hasDefault())
  462. {
  463. string tmp = tars::TC_Common::replace(member[j]->def(), "\"", "\\\"");
  464. s << TAB << "JString_assign(this->" << member[j]->getId() << ", \""
  465. << tmp << "\", strlen(\"" << tmp << "\"));" << endl;
  466. }
  467. continue;
  468. }
  469. }
  470. s << endl;
  471. s << TAB << "return TARS_SUCCESS;" << endl;
  472. DEL_TAB;
  473. s << TAB << "}" << endl;
  474. s << endl;
  475. s << TAB << sStructName << " * " << sStructName << "_new()" << endl;
  476. s << TAB << "{" << endl;
  477. INC_TAB;
  478. s << TAB << "Int32 ret=0;" << endl;
  479. s << TAB << sStructName << " *this = (" << sStructName << " *)TarsMalloc(sizeof("<< sStructName << "));" << endl;
  480. s << TAB << "if(!this) return NULL;" << endl;
  481. s << TAB << "ret = " << sStructName << "_init(this);" << endl;
  482. s << TAB << "if(TARS_SUCCESS != ret) { return NULL; }" << endl;
  483. s << TAB << "return this;" << endl;
  484. DEL_TAB;
  485. s << TAB << "}" << endl;
  486. return s.str();
  487. }
  488. /*******************************ContainerPtr********************************/
  489. string Tars2C::generateH(const ContainerPtr &pPtr) const
  490. {
  491. ostringstream s;
  492. for (size_t i = 0; i < pPtr->getAllNamespacePtr().size(); i++)
  493. {
  494. s << generateH(pPtr->getAllNamespacePtr()[i]) << endl;
  495. s << endl;
  496. }
  497. return s.str();
  498. }
  499. /******************************EnumPtr***************************************/
  500. string Tars2C::generateH(const EnumPtr &pPtr, const string& namespaceId) const
  501. {
  502. ostringstream s;
  503. s << TAB << "enum " << namespaceId << "_" << pPtr->getId() << endl;
  504. s << TAB << "{" << endl;
  505. INC_TAB;
  506. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  507. for (size_t i = 0; i < member.size(); i++)
  508. {
  509. s << TAB << member[i]->getId();
  510. if (member[i]->hasDefault())
  511. {
  512. s << " = " << member[i]->def();
  513. }
  514. s << (i==member.size()-1 ? "" : ",") << endl;
  515. }
  516. DEL_TAB;
  517. s << TAB << "};" << endl;
  518. return s.str();
  519. }
  520. /******************************ConstPtr***************************************/
  521. string Tars2C::generateH(const ConstPtr &pPtr) const
  522. {
  523. ostringstream s;
  524. if (pPtr->getConstGrammarPtr()->t == ConstGrammar::STRING)
  525. {
  526. string tmp = tars::TC_Common::replace(pPtr->getConstGrammarPtr()->v, "\"", "\\\"");
  527. s << TAB << "const " << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " " << pPtr->getTypeIdPtr()->getId() << " = \"" << tmp << "\";"<< endl;
  528. }
  529. else
  530. {
  531. s << TAB << "const " << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " " << pPtr->getTypeIdPtr()->getId() << " = " << pPtr->getConstGrammarPtr()->v
  532. << ((tostr(pPtr->getTypeIdPtr()->getTypePtr()) == "tars::Int64") ? "LL;" : ";" )<< endl;
  533. }
  534. return s.str();
  535. }
  536. /******************************NamespacePtr***************************************/
  537. string Tars2C::generateH(const NamespacePtr &pPtr) const
  538. {
  539. ostringstream s;
  540. vector<StructPtr> &ss = pPtr->getAllStructPtr();
  541. vector<EnumPtr> &es = pPtr->getAllEnumPtr();
  542. s << endl;
  543. for (size_t i = 0; i < es.size(); i++)
  544. {
  545. s << generateH(es[i], pPtr->getId()) << endl;
  546. }
  547. for (size_t i = 0; i < ss.size(); i++)
  548. {
  549. s << generateH(ss[i], pPtr->getId()) << endl;
  550. }
  551. s << endl;
  552. return s.str();
  553. }
  554. string Tars2C::generateC(const NamespacePtr &pPtr) const
  555. {
  556. ostringstream s;
  557. vector<StructPtr> &ss = pPtr->getAllStructPtr();
  558. s << endl;
  559. for (size_t i = 0; i < ss.size(); i++)
  560. {
  561. s << generateC(ss[i], pPtr->getId()) << endl;
  562. }
  563. s << endl;
  564. return s.str();
  565. }
  566. /******************************Tars2C***************************************/
  567. void Tars2C::generateH(const ContextPtr &pPtr) const
  568. {
  569. string n = g_parse->getFileName(pPtr->getFileName());
  570. string fileH = g_parse->getAbsoluteFileName(m_sBaseDir, g_parse->replaceFileName(n, "h"));
  571. string fileCpp = g_parse->getAbsoluteFileName(m_sBaseDir, g_parse->replaceFileName(n, "cpp"));
  572. // string n = tars::TC_File::excludeFileExt(tars::TC_File::extractFileName(pPtr->getFileName()));
  573. //
  574. // string fileH = m_sBaseDir + FILE_SEP + n + ".h";
  575. string define = tars::TC_Common::upper("__" + n + "_h_");
  576. ostringstream s;
  577. s << g_parse->printHeaderRemark();
  578. s << "#ifndef " << define << endl;
  579. s << "#define " << define << endl;
  580. s << endl;
  581. s << "#include \"Tars_c.h\"" << endl;
  582. vector<string> include = pPtr->getIncludes();
  583. for (size_t i = 0; i < include.size(); i++)
  584. {
  585. s << "#include \"" << g_parse->getHeader() << tars::TC_File::extractFileName(include[i]) << "\"" << endl;
  586. }
  587. vector<NamespacePtr> namespaces = pPtr->getNamespaces();
  588. s << endl;
  589. for (size_t i = 0; i < namespaces.size(); i++)
  590. {
  591. s << generateH(namespaces[i]) << endl;
  592. }
  593. s << endl;
  594. s << "#endif" << endl;
  595. tars::TC_File::makeDirRecursive(m_sBaseDir);
  596. tars::TC_File::save2file(fileH, s.str());
  597. }
  598. void Tars2C::generateC(const ContextPtr &pPtr) const
  599. {
  600. string n = tars::TC_File::excludeFileExt(tars::TC_File::extractFileName(pPtr->getFileName()));
  601. string fileC = m_sBaseDir + FILE_SEP + n + ".c";
  602. string define = tars::TC_Common::upper("__" + n + "_h_");
  603. ostringstream s;
  604. s << g_parse->printHeaderRemark();
  605. vector<NamespacePtr> namespaces = pPtr->getNamespaces();
  606. s << "#include \"" << g_parse->getHeader() << n << ".h\"" << endl;
  607. s << endl;
  608. for (size_t i = 0; i < namespaces.size(); i++)
  609. {
  610. s << generateC(namespaces[i]) << endl;
  611. }
  612. s << endl;
  613. tars::TC_File::makeDirRecursive(m_sBaseDir);
  614. tars::TC_File::save2file(fileC, s.str());
  615. }
  616. void Tars2C::createFile(const string &file)
  617. {
  618. std::vector<ContextPtr> contexts = g_parse->getContexts();
  619. for (size_t i = 0; i < contexts.size(); i++)
  620. {
  621. if (file == contexts[i]->getFileName())
  622. {
  623. generateH(contexts[i]);
  624. generateC(contexts[i]);
  625. }
  626. }
  627. }
  628. StructPtr Tars2C::findStruct(const ContextPtr &pPtr,const string &id)
  629. {
  630. string sid = id;
  631. // 在当前namespace中查找
  632. vector<NamespacePtr> namespaces = pPtr->getNamespaces();
  633. for (size_t i = 0; i < namespaces.size(); i++)
  634. {
  635. NamespacePtr np = namespaces[i];
  636. vector<StructPtr> structs = np->getAllStructPtr();
  637. for (size_t i = 0; i < structs.size(); i++)
  638. {
  639. if (structs[i]->getSid() == sid)
  640. {
  641. return structs[i];
  642. }
  643. }
  644. }
  645. return NULL;
  646. }