gen_rpc.awk
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:43k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #
  2. # $Id: gen_rpc.awk,v 11.25 2001/01/02 20:04:55 sue Exp $
  3. # Awk script for generating client/server RPC code.
  4. #
  5. # This awk script generates most of the RPC routines for DB client/server
  6. # use. It also generates a template for server and client procedures.  These
  7. # functions must still be edited, but are highly stylized and the initial
  8. # template gets you a fair way along the path).
  9. #
  10. # This awk script requires that these variables be set when it is called:
  11. #
  12. # client_file -- the C source file being created for client code
  13. # cproto_file -- the header file create for client prototypes
  14. # ctmpl_file -- the C template file being created for client code
  15. # sed_file -- the sed file created to alter server proc code
  16. # server_file -- the C source file being created for server code
  17. # sproto_file -- the header file create for server prototypes
  18. # stmpl_file -- the C template file being created for server code
  19. # xdr_file -- the XDR message file created
  20. #
  21. # And stdin must be the input file that defines the RPC setup.
  22. BEGIN {
  23. if (client_file == "" || cproto_file == "" || ctmpl_file == "" ||
  24.     sed_file == "" || server_file == "" ||
  25.     sproto_file == "" || stmpl_file == "" || xdr_file == "") {
  26. print "Usage: gen_rpc.awk requires these variables be set:"
  27. print "tclient_filet-- the client C source file being created"
  28. print "tcproto_filet-- the client prototype header created"
  29. print "tctmpl_filet-- the client template file being created"
  30. print "tsed_filet-- the sed command file being created"
  31. print "tserver_filet-- the server C source file being created"
  32. print "tsproto_filet-- the server prototype header created"
  33. print "tstmpl_filet-- the server template file being created"
  34. print "txdr_filet-- the XDR message file being created"
  35. error = 1; exit
  36. }
  37. FS="tt*"
  38. CFILE=client_file
  39. printf("/* Do not edit: automatically built by gen_rpc.awk. */n") 
  40.     > CFILE
  41. CHFILE=cproto_file
  42. printf("/* Do not edit: automatically built by gen_rpc.awk. */n") 
  43.     > CHFILE
  44. TFILE = ctmpl_file
  45. printf("/* Do not edit: automatically built by gen_rpc.awk. */n") 
  46.     > TFILE
  47. SFILE = server_file
  48. printf("/* Do not edit: automatically built by gen_rpc.awk. */n") 
  49.     > SFILE
  50. SHFILE=sproto_file
  51. printf("/* Do not edit: automatically built by gen_rpc.awk. */n") 
  52.     > SHFILE
  53. # Server procedure template and a sed file to massage an existing
  54. # template source file to change args.
  55. # SEDFILE should be same name as PFILE but .c
  56. #
  57. PFILE = stmpl_file
  58. SEDFILE = sed_file
  59. printf("") > SEDFILE
  60. printf("/* Do not edit: automatically built by gen_rpc.awk. */n") 
  61.     > PFILE
  62. XFILE = xdr_file
  63. printf("/* Do not edit: automatically built by gen_rpc.awk. */n") 
  64.     > XFILE
  65. nendlist = 1;
  66. }
  67. END {
  68. printf("#endif /* HAVE_RPC */n") >> CFILE
  69. printf("#endif /* HAVE_RPC */n") >> TFILE
  70. printf("program DB_SERVERPROG {n") >> XFILE
  71. printf("tversion DB_SERVERVERS {n") >> XFILE
  72. for (i = 1; i < nendlist; ++i)
  73. printf("tt%s;n", endlist[i]) >> XFILE
  74. printf("t} = 1;n") >> XFILE
  75. printf("} = 351457;n") >> XFILE
  76. }
  77. /^[  ]*BEGIN/ {
  78. name = $2;
  79. msgid = $3;
  80. nofunc_code = 0;
  81. funcvars = 0;
  82. gen_code = 1;
  83. ret_code = 0;
  84. if ($4 == "NOCLNTCODE")
  85. gen_code = 0;
  86. if ($4 == "NOFUNC")
  87. nofunc_code = 1;
  88. if ($4 == "RETCODE")
  89. ret_code = 1;
  90. nvars = 0;
  91. rvars = 0;
  92. newvars = 0;
  93. db_handle = 0;
  94. env_handle = 0;
  95. dbc_handle = 0;
  96. txn_handle = 0;
  97. mp_handle = 0;
  98. dbt_handle = 0;
  99. xdr_free = 0;
  100. }
  101. /^[  ]*ARG/ {
  102. rpc_type[nvars] = $2;
  103. c_type[nvars] = $3;
  104. pr_type[nvars] = $3;
  105. args[nvars] = $4;
  106. func_arg[nvars] = 0;
  107. if (rpc_type[nvars] == "LIST") {
  108. list_type[nvars] = $5;
  109. } else
  110. list_type[nvars] = 0;
  111. if (c_type[nvars] == "DBT *")
  112. dbt_handle = 1;
  113. if (c_type[nvars] == "DB_ENV *") {
  114. ctp_type[nvars] = "CT_ENV";
  115. env_handle = 1;
  116. env_idx = nvars;
  117. }
  118. if (c_type[nvars] == "DB *") {
  119. ctp_type[nvars] = "CT_DB";
  120. db_handle = 1;
  121. db_idx = nvars;
  122. }
  123. if (c_type[nvars] == "DBC *") {
  124. ctp_type[nvars] = "CT_CURSOR";
  125. dbc_handle = 1;
  126. dbc_idx = nvars;
  127. }
  128. if (c_type[nvars] == "DB_TXN *") {
  129. ctp_type[nvars] = "CT_TXN";
  130. txn_handle = 1;
  131. txn_idx = nvars;
  132. }
  133. if (c_type[nvars] == "DB_MPOOLFILE *") {
  134. mp_handle = 1;
  135. mp_idx = nvars;
  136. }
  137. ++nvars;
  138. }
  139. /^[  ]*FUNCPROT/ {
  140. pr_type[nvars] = $2;
  141. }
  142. /^[  ]*FUNCARG/ {
  143. rpc_type[nvars] = "IGNORE";
  144. c_type[nvars] = $2;
  145. args[nvars] = sprintf("func%d", funcvars);
  146. func_arg[nvars] = 1;
  147. ++funcvars;
  148. ++nvars;
  149. }
  150. /^[  ]*RET/ {
  151. ret_type[rvars] = $2;
  152. retc_type[rvars] = $3;
  153. retargs[rvars] = $4;
  154. if (ret_type[rvars] == "LIST" || ret_type[rvars] == "DBT") {
  155. xdr_free = 1;
  156. }
  157. if (ret_type[rvars] == "LIST") {
  158. retlist_type[rvars] = $5;
  159. } else
  160. retlist_type[rvars] = 0;
  161. ++rvars;
  162. }
  163. /^[  ]*END/ {
  164. #
  165. # =====================================================
  166. # Generate Client Nofunc code first if necessary
  167. # NOTE:  This code must be first, because we don't want any
  168. # other code other than this function, so before we write
  169. # out to the XDR and server files, we just generate this
  170. # and move on if this is all we are doing.
  171. #
  172. if (nofunc_code == 1) {
  173. #
  174. # First time through, put out the general illegal function
  175. #
  176. if (first_nofunc == 0) {
  177. printf("int __dbcl_rpc_illegal ") >> CHFILE
  178. printf("__P((DB_ENV *, char *));n") >> CHFILE
  179. printf("intn__dbcl_rpc_illegal(dbenv, name)n") 
  180. >> CFILE
  181. printf("tDB_ENV *dbenv;ntchar *name;n") >> CFILE
  182. printf("{nt__db_err(dbenv,n") >> CFILE
  183. printf("t    "%%s method meaningless in RPC") >> CFILE
  184. printf(" environment", name);n") >> CFILE
  185. printf("treturn (__db_eopnotsup(dbenv));n") >> CFILE
  186. printf("}nn") >> CFILE
  187. first_nofunc = 1
  188. }
  189. #
  190. # If we are doing a list, spit out prototype decl.
  191. #
  192. for (i = 0; i < nvars; i++) {
  193. if (rpc_type[i] != "LIST")
  194. continue;
  195. printf("static int __dbcl_%s_%slist __P((", 
  196.     name, args[i]) >> CFILE
  197. printf("__%s_%slist **, ", name, args[i]) >> CFILE
  198. if (list_type[i] == "STRING")
  199. printf("%s));n", c_type[i]) >> CFILE
  200. if (list_type[i] == "INT")
  201. printf("u_int32_t));n") >> CFILE
  202. if (list_type[i] == "ID")
  203. printf("%s));n", c_type[i]) >> CFILE
  204. printf("static void __dbcl_%s_%sfree __P((", 
  205.     name, args[i]) >> CFILE
  206. printf("__%s_%slist **));n", name, args[i]) >> CFILE
  207. }
  208. #
  209. # Spit out PUBLIC prototypes.
  210. #
  211. printf("int __dbcl_%s __P((",name) >> CHFILE
  212. sep = "";
  213. for (i = 0; i < nvars; ++i) {
  214. printf("%s%s", sep, pr_type[i]) >> CHFILE
  215. sep = ", ";
  216. }
  217. printf("));n") >> CHFILE
  218. #
  219. # Spit out function name/args.
  220. #
  221. printf("intn") >> CFILE
  222. printf("__dbcl_%s(", name) >> CFILE
  223. sep = "";
  224. for (i = 0; i < nvars; ++i) {
  225. printf("%s%s", sep, args[i]) >> CFILE
  226. sep = ", ";
  227. }
  228. printf(")n") >> CFILE
  229. for (i = 0; i < nvars; ++i)
  230. if (func_arg[i] == 0)
  231. printf("t%s %s;n", c_type[i], args[i]) 
  232.     >> CFILE
  233. else
  234. printf("t%s;n", c_type[i]) >> CFILE
  235. #
  236. # Call error function and return EINVAL
  237. #
  238. printf("{n") >> CFILE
  239. #
  240. # If we don't have a local env, set one.
  241. #
  242. if (env_handle == 0) {
  243. printf("tDB_ENV *dbenv;nn") >> CFILE
  244. if (db_handle)
  245. printf("tdbenv = %s->dbenv;n", 
  246.     args[db_idx]) >> CFILE
  247. else if (dbc_handle)
  248. printf("tdbenv = %s->dbp->dbenv;n", 
  249.     args[dbc_idx]) >> CFILE
  250. else if (txn_handle)
  251. printf("tdbenv = %s->mgrp->dbenv;n", 
  252.     args[txn_idx]) >> CFILE
  253. else if (mp_handle)
  254. printf("tdbenv = %s->dbmp->dbenv;n", 
  255.     args[mp_idx]) >> CFILE
  256. else
  257. printf("tdbenv = NULL;n") >> CFILE
  258. }
  259. #
  260. # Quiet the compiler for all variables.
  261. #
  262. # NOTE:  Index 'i' starts at 1, not 0.  Our first arg is
  263. # the handle we need to get to the env, and we do not want
  264. # to COMPQUIET that one.
  265. for (i = 1; i < nvars; ++i) {
  266. if (rpc_type[i] == "CONST" || rpc_type[i] == "DBT" ||
  267.     rpc_type[i] == "LIST" || rpc_type[i] == "STRING") {
  268. printf("tCOMPQUIET(%s, NULL);n", args[i]) 
  269.     >> CFILE
  270. }
  271. if (rpc_type[i] == "INT" || rpc_type[i] == "IGNORE" ||
  272.     rpc_type[i] == "ID") {
  273. printf("tCOMPQUIET(%s, 0);n", args[i]) 
  274.     >> CFILE
  275. }
  276. }
  277. if (!env_handle) {
  278. printf("treturn (__dbcl_rpc_illegal(dbenv, ") >> CFILE
  279. printf(""%s"));n", name) >> CFILE
  280. } else
  281. printf("treturn (__dbcl_rpc_illegal(%s, "%s"));n", 
  282.     args[env_idx], name) >> CFILE
  283. printf("}nn") >> CFILE
  284. next;
  285. }
  286. #
  287. # =====================================================
  288. # XDR messages.
  289. #
  290. printf("n") >> XFILE
  291. #
  292. # If there are any lists, generate the structure to contain them.
  293. #
  294. for (i = 0; i < nvars; ++i) {
  295. if (rpc_type[i] == "LIST") {
  296. printf("struct __%s_%slist {n", name, args[i]) >> XFILE
  297. printf("topaque ent<>;n") >> XFILE
  298. printf("t__%s_%slist *next;n", name, args[i]) >> XFILE
  299. printf("};nn") >> XFILE
  300. }
  301. }
  302. printf("struct __%s_msg {n", name) >> XFILE
  303. for (i = 0; i < nvars; ++i) {
  304. if (rpc_type[i] == "ID") {
  305. printf("tunsigned int %scl_id;n", args[i]) >> XFILE
  306. }
  307. if (rpc_type[i] == "STRING") {
  308. printf("tstring %s<>;n", args[i]) >> XFILE
  309. }
  310. if (rpc_type[i] == "INT") {
  311. printf("tunsigned int %s;n", args[i]) >> XFILE
  312. }
  313. if (rpc_type[i] == "DBT") {
  314. printf("tunsigned int %sdlen;n", args[i]) >> XFILE
  315. printf("tunsigned int %sdoff;n", args[i]) >> XFILE
  316. printf("tunsigned int %sflags;n", args[i]) >> XFILE
  317. printf("topaque %sdata<>;n", args[i]) >> XFILE
  318. }
  319. if (rpc_type[i] == "LIST") {
  320. printf("t__%s_%slist *%slist;n", 
  321.     name, args[i], args[i]) >> XFILE
  322. }
  323. }
  324. printf("};n") >> XFILE
  325. printf("n") >> XFILE
  326. #
  327. # If there are any lists, generate the structure to contain them.
  328. #
  329. for (i = 0; i < rvars; ++i) {
  330. if (ret_type[i] == "LIST") {
  331. printf("struct __%s_%sreplist {n", 
  332.     name, retargs[i]) >> XFILE
  333. printf("topaque ent<>;n") >> XFILE
  334. printf("t__%s_%sreplist *next;n", 
  335.     name, retargs[i]) >> XFILE
  336. printf("};nn") >> XFILE
  337. }
  338. }
  339. #
  340. # Generate the reply message
  341. #
  342. printf("struct __%s_reply {n", name) >> XFILE
  343. printf("tunsigned int status;n") >> XFILE
  344. for (i = 0; i < rvars; ++i) {
  345. if (ret_type[i] == "ID") {
  346. printf("tunsigned int %scl_id;n", retargs[i]) >> XFILE
  347. }
  348. if (ret_type[i] == "STRING") {
  349. printf("tstring %s<>;n", retargs[i]) >> XFILE
  350. }
  351. if (ret_type[i] == "INT") {
  352. printf("tunsigned int %s;n", retargs[i]) >> XFILE
  353. }
  354. if (ret_type[i] == "DBL") {
  355. printf("tdouble %s;n", retargs[i]) >> XFILE
  356. }
  357. if (ret_type[i] == "DBT") {
  358. printf("topaque %sdata<>;n", retargs[i]) >> XFILE
  359. }
  360. if (ret_type[i] == "LIST") {
  361. printf("t__%s_%sreplist *%slist;n", 
  362.     name, retargs[i], retargs[i]) >> XFILE
  363. }
  364. }
  365. printf("};n") >> XFILE
  366. endlist[nendlist] = 
  367.     sprintf("__%s_reply __DB_%s(__%s_msg) = %d", 
  368. name, name, name, nendlist);
  369. nendlist++;
  370. #
  371. # =====================================================
  372. # File headers, if necessary.
  373. #
  374. if (first == 0) {
  375. printf("#include "db_config.h"n") >> CFILE
  376. printf("n") >> CFILE
  377. printf("#ifdef HAVE_RPCn") >> CFILE
  378. printf("#ifndef NO_SYSTEM_INCLUDESn") >> CFILE
  379. printf("#include <sys/types.h>n") >> CFILE
  380. printf("#include <rpc/rpc.h>n") >> CFILE
  381. printf("#include <rpc/xdr.h>n") >> CFILE
  382. printf("n") >> CFILE
  383. printf("#include <errno.h>n") >> CFILE
  384. printf("#include <string.h>n") >> CFILE
  385. printf("#endifn") >> CFILE
  386. printf("#include "db_server.h"n") >> CFILE
  387. printf("n") >> CFILE
  388. printf("#include "db_int.h"n") >> CFILE
  389. printf("#include "db_page.h"n") >> CFILE
  390. printf("#include "db_ext.h"n") >> CFILE
  391. printf("#include "mp.h"n") >> CFILE
  392. printf("#include "rpc_client_ext.h"n") >> CFILE
  393. printf("#include "txn.h"n") >> CFILE
  394. printf("n") >> CFILE
  395. n = split(CHFILE, hpieces, "/");
  396. printf("#include "%s"n", hpieces[n]) >> CFILE
  397. printf("n") >> CFILE
  398. printf("#include "db_config.h"n") >> TFILE
  399. printf("n") >> TFILE
  400. printf("#ifdef HAVE_RPCn") >> TFILE
  401. printf("#ifndef NO_SYSTEM_INCLUDESn") >> TFILE
  402. printf("#include <sys/types.h>n") >> TFILE
  403. printf("#include <rpc/rpc.h>n") >> TFILE
  404. printf("n") >> TFILE
  405. printf("#include <errno.h>n") >> TFILE
  406. printf("#include <string.h>n") >> TFILE
  407. printf("#endifn") >> TFILE
  408. printf("#include "db_server.h"n") >> TFILE
  409. printf("n") >> TFILE
  410. printf("#include "db_int.h"n") >> TFILE
  411. printf("#include "db_page.h"n") >> TFILE
  412. printf("#include "db_ext.h"n") >> TFILE
  413. printf("#include "txn.h"n") >> TFILE
  414. printf("n") >> TFILE
  415. n = split(CHFILE, hpieces, "/");
  416. printf("#include "%s"n", hpieces[n]) >> TFILE
  417. printf("n") >> TFILE
  418. printf("#include "db_config.h"n") >> SFILE
  419. printf("n") >> SFILE
  420. printf("#ifndef NO_SYSTEM_INCLUDESn") >> SFILE
  421. printf("#include <sys/types.h>n") >> SFILE
  422. printf("n") >> SFILE
  423. printf("#include <rpc/rpc.h>n") >> SFILE
  424. printf("#include <rpc/xdr.h>n") >> SFILE
  425. printf("n") >> SFILE
  426. printf("#include <errno.h>n") >> SFILE
  427. printf("#include <string.h>n") >> SFILE
  428. printf("#endifn") >> SFILE
  429. printf("#include "db_server.h"n") >> SFILE
  430. printf("n") >> SFILE
  431. printf("#include "db_int.h"n") >> SFILE
  432. printf("#include "db_server_int.h"n") >> SFILE
  433. printf("#include "rpc_server_ext.h"n") >> SFILE
  434. printf("n") >> SFILE
  435. n = split(SHFILE, hpieces, "/");
  436. printf("#include "%s"n", hpieces[n]) >> SFILE
  437. printf("n") >> SFILE
  438. printf("#include "db_config.h"n") >> PFILE
  439. printf("n") >> PFILE
  440. printf("#ifndef NO_SYSTEM_INCLUDESn") >> PFILE
  441. printf("#include <sys/types.h>n") >> PFILE
  442. printf("n") >> PFILE
  443. printf("#include <rpc/rpc.h>n") >> PFILE
  444. printf("n") >> PFILE
  445. printf("#include <errno.h>n") >> PFILE
  446. printf("#include <string.h>n") >> PFILE
  447. printf("#include "db_server.h"n") >> PFILE
  448. printf("#endifn") >> PFILE
  449. printf("n") >> PFILE
  450. printf("#include "db_int.h"n") >> PFILE
  451. printf("#include "db_server_int.h"n") >> PFILE
  452. printf("#include "rpc_server_ext.h"n") >> PFILE
  453. printf("n") >> PFILE
  454. n = split(SHFILE, hpieces, "/");
  455. printf("#include "%s"n", hpieces[n]) >> PFILE
  456. printf("n") >> PFILE
  457. first = 1;
  458. }
  459. #
  460. # =====================================================
  461. # Server functions.
  462. #
  463. # If we are doing a list, send out local list prototypes.
  464. #
  465. for (i = 0; i < nvars; ++i) {
  466. if (rpc_type[i] != "LIST")
  467. continue;
  468. if (list_type[i] != "STRING" && list_type[i] != "INT" &&
  469.     list_type[i] != "ID")
  470. continue;
  471. printf("int __db_%s_%slist __P((", name, args[i]) >> SFILE
  472. printf("__%s_%slist *, ", name, args[i]) >> SFILE
  473. if (list_type[i] == "STRING") {
  474. printf("char ***));n") >> SFILE
  475. }
  476. if (list_type[i] == "INT" || list_type[i] == "ID") {
  477. printf("u_int32_t **));n") >> SFILE
  478. }
  479. printf("void __db_%s_%sfree __P((", name, args[i]) >> SFILE
  480. if (list_type[i] == "STRING")
  481. printf("char **));nn") >> SFILE
  482. if (list_type[i] == "INT" || list_type[i] == "ID")
  483. printf("u_int32_t *));nn") >> SFILE
  484. }
  485. #
  486. # First spit out PUBLIC prototypes for server functions.
  487. #
  488. printf("__%s_reply * __db_%s_%d __P((__%s_msg *));n", 
  489.     name, name, msgid, name) >> SHFILE
  490. printf("__%s_reply *n", name) >> SFILE
  491. printf("__db_%s_%d(req)n", name, msgid) >> SFILE
  492. printf("t__%s_msg *req;n", name) >> SFILE;
  493. printf("{n") >> SFILE
  494. doing_list = 0;
  495. #
  496. # If we are doing a list, decompose it for server proc we'll call.
  497. #
  498. for (i = 0; i < nvars; ++i) {
  499. if (rpc_type[i] != "LIST")
  500. continue;
  501. doing_list = 1;
  502. if (list_type[i] == "STRING")
  503. printf("tchar **__db_%slist;n", args[i]) >> SFILE
  504. if (list_type[i] == "ID" || list_type[i] == "INT")
  505. printf("tu_int32_t *__db_%slist;n", args[i]) >> SFILE
  506. }
  507. if (doing_list)
  508. printf("tint ret;n") >> SFILE
  509. printf("tstatic __%s_reply reply; /* must be static */n", 
  510.     name) >> SFILE
  511. if (xdr_free) {
  512. printf("tstatic int __%s_free = 0; /* must be static */nn", 
  513.     name) >> SFILE
  514. printf("tif (__%s_free)n", name) >> SFILE
  515. printf("ttxdr_free((xdrproc_t)xdr___%s_reply, (void *)&reply);n", 
  516.     name) >> SFILE
  517. printf("t__%s_free = 0;n", name) >> SFILE
  518. printf("nt/* Reinitialize allocated fields */n") >> SFILE
  519. for (i = 0; i < rvars; ++i) {
  520. if (ret_type[i] == "LIST") {
  521. printf("treply.%slist = NULL;n", 
  522.     retargs[i]) >> SFILE
  523. }
  524. if (ret_type[i] == "DBT") {
  525. printf("treply.%sdata.%sdata_val = NULL;n", 
  526.     retargs[i], retargs[i]) >> SFILE
  527. }
  528. }
  529. }
  530. need_out = 0;
  531. for (i = 0; i < nvars; ++i) {
  532. if (rpc_type[i] == "LIST") {
  533. printf("ntif ((ret = __db_%s_%slist(", 
  534.     name, args[i]) >> SFILE
  535. printf("req->%slist, &__db_%slist)) != 0)n", 
  536.     args[i], args[i]) >> SFILE
  537. printf("ttgoto out;n") >> SFILE
  538. need_out = 1;
  539. }
  540. }
  541. #
  542. # Compose server proc to call.  Decompose message components as args.
  543. #
  544. printf("nt__%s_%d_proc(", name, msgid) >> SFILE
  545. sep = "";
  546. for (i = 0; i < nvars; ++i) {
  547. if (rpc_type[i] == "ID") {
  548. printf("%sreq->%scl_id", sep, args[i]) >> SFILE
  549. }
  550. if (rpc_type[i] == "STRING") {
  551. printf("%s(*req->%s == '\0') ? NULL : req->%s", 
  552.     sep, args[i], args[i]) >> SFILE
  553. }
  554. if (rpc_type[i] == "INT") {
  555. printf("%sreq->%s", sep, args[i]) >> SFILE
  556. }
  557. if (rpc_type[i] == "LIST") {
  558. printf("%s__db_%slist", sep, args[i]) >> SFILE
  559. }
  560. if (rpc_type[i] == "DBT") {
  561. printf("%sreq->%sdlen", sep, args[i]) >> SFILE
  562. sep = ",nt    ";
  563. printf("%sreq->%sdoff", sep, args[i]) >> SFILE
  564. printf("%sreq->%sflags", sep, args[i]) >> SFILE
  565. printf("%sreq->%sdata.%sdata_val", 
  566.     sep, args[i], args[i]) >> SFILE
  567. printf("%sreq->%sdata.%sdata_len", 
  568.     sep, args[i], args[i]) >> SFILE
  569. }
  570. sep = ",nt    ";
  571. }
  572. printf("%s&reply", sep) >> SFILE
  573. if (xdr_free)
  574. printf("%s&__%s_free);n", sep, name) >> SFILE
  575. else
  576. printf(");nn") >> SFILE
  577. for (i = 0; i < nvars; ++i) {
  578. if (rpc_type[i] == "LIST") {
  579. printf("t__db_%s_%sfree(__db_%slist);n", 
  580.     name, args[i], args[i]) >> SFILE
  581. }
  582. }
  583. if (need_out) {
  584. printf("nout:n") >> SFILE
  585. }
  586. printf("treturn (&reply);n") >> SFILE
  587. printf("}nn") >> SFILE
  588. #
  589. # If we are doing a list, write list functions for this op.
  590. #
  591. for (i = 0; i < nvars; ++i) {
  592. if (rpc_type[i] != "LIST")
  593. continue;
  594. if (list_type[i] != "STRING" && list_type[i] != "INT" &&
  595.     list_type[i] != "ID")
  596. continue;
  597. printf("intn") >> SFILE
  598. printf("__db_%s_%slist(locp, ppp)n", name, args[i]) >> SFILE
  599. printf("t__%s_%slist *locp;n", name, args[i]) >> SFILE
  600. if (list_type[i] == "STRING") {
  601. printf("tchar ***ppp;n{n") >> SFILE
  602. printf("tchar **pp;n") >> SFILE
  603. }
  604. if (list_type[i] == "INT" || list_type[i] == "ID") {
  605. printf("tu_int32_t **ppp;n{n") >> SFILE
  606. printf("tu_int32_t *pp;n") >> SFILE
  607. }
  608. printf("tint cnt, ret, size;n") >> SFILE
  609. printf("t__%s_%slist *nl;nn", name, args[i]) >> SFILE
  610. printf("tfor (cnt = 0, nl = locp;") >> SFILE
  611. printf(" nl != NULL; cnt++, nl = nl->next)ntt;nn") >> SFILE
  612. printf("tif (cnt == 0) {n") >> SFILE
  613. printf("tt*ppp = NULL;n") >> SFILE
  614. printf("ttreturn (0);nt}n") >> SFILE
  615. printf("tsize = sizeof(*pp) * (cnt + 1);n") >> SFILE
  616. printf("tif ((ret = __os_malloc(NULL, size, ") >> SFILE
  617. printf("NULL, ppp)) != 0)n") >> SFILE
  618. printf("ttreturn (ret);n") >> SFILE
  619. printf("tmemset(*ppp, 0, size);n") >> SFILE
  620. printf("tfor (pp = *ppp, nl = locp;") >> SFILE
  621. printf(" nl != NULL; nl = nl->next, pp++) {n") >> SFILE
  622. if (list_type[i] == "STRING") {
  623. printf("ttif ((ret = __os_malloc(NULL ,") >> SFILE
  624. printf("nl->ent.ent_len + 1, NULL, pp)) != 0)n") 
  625.     >> SFILE
  626. printf("tttgoto out;n") >> SFILE
  627. printf("ttif ((ret = __os_strdup(NULL, ") >> SFILE
  628. printf("(char *)nl->ent.ent_val, pp)) != 0)n") >> SFILE
  629. printf("tttgoto out;n") >> SFILE
  630. }
  631. if (list_type[i] == "INT" || list_type[i] == "ID")
  632. printf("tt*pp = *(u_int32_t *)nl->ent.ent_val;n") 
  633.     >> SFILE
  634. printf("t}n") >> SFILE
  635. printf("treturn (0);n") >> SFILE
  636. if (list_type[i] == "STRING") {
  637. printf("out:n") >> SFILE
  638. printf("t__db_%s_%sfree(*ppp);n", 
  639.     name, args[i]) >> SFILE
  640. printf("treturn (ret);n") >> SFILE
  641. }
  642. printf("}nn") >> SFILE
  643. printf("voidn") >> SFILE
  644. printf("__db_%s_%sfree(pp)n", name, args[i]) >> SFILE
  645. if (list_type[i] == "STRING")
  646. printf("tchar **pp;n") >> SFILE
  647. if (list_type[i] == "INT" || list_type[i] == "ID")
  648. printf("tu_int32_t *pp;n") >> SFILE
  649. printf("{n") >> SFILE
  650. printf("tsize_t size;n") >> SFILE
  651. if (list_type[i] == "STRING")
  652. printf("tchar **p;nn") >> SFILE
  653. if (list_type[i] == "INT" || list_type[i] == "ID")
  654. printf("tu_int32_t *p;nn") >> SFILE
  655. printf("tif (pp == NULL)nttreturn;n") >> SFILE
  656. printf("tsize = sizeof(*p);n") >> SFILE
  657. printf("tfor (p = pp; *p != 0; p++) {n") >> SFILE
  658. printf("ttsize += sizeof(*p);n") >> SFILE
  659. if (list_type[i] == "STRING")
  660. printf("tt__os_free(*p, strlen(*p)+1);n") >> SFILE
  661. printf("t}n") >> SFILE
  662. printf("t__os_free(pp, size);n") >> SFILE
  663. printf("}nn") >> SFILE
  664. }
  665. #
  666. # =====================================================
  667. # Generate Procedure Template Server code
  668. #
  669. # Produce SED file commands if needed at the same time
  670. #
  671. # Start with PUBLIC prototypes
  672. #
  673. printf("void __%s_%d_proc __P((", name, msgid) >> SHFILE
  674. sep = "";
  675. argcount = 0;
  676. for (i = 0; i < nvars; ++i) {
  677. argcount++;
  678. split_lines(1);
  679. if (argcount == 0) {
  680. sep = "";
  681. }
  682. if (rpc_type[i] == "IGNORE")
  683. continue;
  684. if (rpc_type[i] == "ID") {
  685. printf("%slong", sep) >> SHFILE
  686. }
  687. if (rpc_type[i] == "STRING") {
  688. printf("%schar *", sep) >> SHFILE
  689. }
  690. if (rpc_type[i] == "INT") {
  691. printf("%su_int32_t", sep) >> SHFILE
  692. }
  693. if (rpc_type[i] == "LIST" && list_type[i] == "STRING") {
  694. printf("%schar **", sep) >> SHFILE
  695. }
  696. if (rpc_type[i] == "LIST" && list_type[i] == "INT") {
  697. printf("%su_int32_t *", sep) >> SHFILE
  698. }
  699. if (rpc_type[i] == "LIST" && list_type[i] == "ID") {
  700. printf("%su_int32_t *", sep) >> SHFILE
  701. }
  702. if (rpc_type[i] == "DBT") {
  703. printf("%su_int32_t", sep) >> SHFILE
  704. sep = ", ";
  705. argcount++;
  706. split_lines(1);
  707. if (argcount == 0) {
  708. sep = "";
  709. } else {
  710. sep = ", ";
  711. }
  712. printf("%su_int32_t", sep) >> SHFILE
  713. argcount++;
  714. split_lines(1);
  715. if (argcount == 0) {
  716. sep = "";
  717. } else {
  718. sep = ", ";
  719. }
  720. printf("%su_int32_t", sep) >> SHFILE
  721. argcount++;
  722. split_lines(1);
  723. if (argcount == 0) {
  724. sep = "";
  725. } else {
  726. sep = ", ";
  727. }
  728. printf("%svoid *", sep) >> SHFILE
  729. argcount++;
  730. split_lines(1);
  731. if (argcount == 0) {
  732. sep = "";
  733. } else {
  734. sep = ", ";
  735. }
  736. printf("%su_int32_t", sep) >> SHFILE
  737. }
  738. sep = ", ";
  739. }
  740. printf("%s__%s_reply *", sep, name) >> SHFILE
  741. if (xdr_free) {
  742. printf("%sint *));n", sep) >> SHFILE
  743. } else {
  744. printf("));n") >> SHFILE
  745. }
  746. #
  747. # Spit out function name and arg list
  748. #
  749. printf("/^\/\* BEGIN __%s_%d_proc/,/^\/\* END __%s_%d_proc/c\n", 
  750.     name, msgid, name, msgid) >> SEDFILE
  751. printf("/* BEGIN __%s_%d_proc */n", name, msgid) >> PFILE
  752. printf("/* BEGIN __%s_%d_proc */\n", name, msgid) >> SEDFILE
  753. printf("voidn") >> PFILE
  754. printf("void\n") >> SEDFILE
  755. printf("__%s_%d_proc(", name, msgid) >> PFILE
  756. printf("__%s_%d_proc(", name, msgid) >> SEDFILE
  757. sep = "";
  758. argcount = 0;
  759. for (i = 0; i < nvars; ++i) {
  760. argcount++;
  761. split_lines(0);
  762. if (argcount == 0) {
  763. sep = "";
  764. }
  765. if (rpc_type[i] == "IGNORE") 
  766. continue;
  767. if (rpc_type[i] == "ID") {
  768. printf("%s%scl_id", sep, args[i]) >> PFILE
  769. printf("%s%scl_id", sep, args[i]) >> SEDFILE
  770. }
  771. if (rpc_type[i] == "STRING") {
  772. printf("%s%s", sep, args[i]) >> PFILE
  773. printf("%s%s", sep, args[i]) >> SEDFILE
  774. }
  775. if (rpc_type[i] == "INT") {
  776. printf("%s%s", sep, args[i]) >> PFILE
  777. printf("%s%s", sep, args[i]) >> SEDFILE
  778. }
  779. if (rpc_type[i] == "LIST") {
  780. printf("%s%slist", sep, args[i]) >> PFILE
  781. printf("%s%slist", sep, args[i]) >> SEDFILE
  782. }
  783. if (rpc_type[i] == "DBT") {
  784. printf("%s%sdlen", sep, args[i]) >> PFILE
  785. printf("%s%sdlen", sep, args[i]) >> SEDFILE
  786. sep = ", ";
  787. argcount++;
  788. split_lines(0);
  789. if (argcount == 0) {
  790. sep = "";
  791. } else {
  792. sep = ", ";
  793. }
  794. printf("%s%sdoff", sep, args[i]) >> PFILE
  795. printf("%s%sdoff", sep, args[i]) >> SEDFILE
  796. argcount++;
  797. split_lines(0);
  798. if (argcount == 0) {
  799. sep = "";
  800. } else {
  801. sep = ", ";
  802. }
  803. printf("%s%sflags", sep, args[i]) >> PFILE
  804. printf("%s%sflags", sep, args[i]) >> SEDFILE
  805. argcount++;
  806. split_lines(0);
  807. if (argcount == 0) {
  808. sep = "";
  809. } else {
  810. sep = ", ";
  811. }
  812. printf("%s%sdata", sep, args[i]) >> PFILE
  813. printf("%s%sdata", sep, args[i]) >> SEDFILE
  814. argcount++;
  815. split_lines(0);
  816. if (argcount == 0) {
  817. sep = "";
  818. } else {
  819. sep = ", ";
  820. }
  821. printf("%s%ssize", sep, args[i]) >> PFILE
  822. printf("%s%ssize", sep, args[i]) >> SEDFILE
  823. }
  824. sep = ", ";
  825. }
  826. printf("%sreplyp",sep) >> PFILE
  827. printf("%sreplyp",sep) >> SEDFILE
  828. if (xdr_free) {
  829. printf("%sfreep)n",sep) >> PFILE
  830. printf("%sfreep)\n",sep) >> SEDFILE
  831. } else {
  832. printf(")n") >> PFILE
  833. printf(")\n") >> SEDFILE
  834. }
  835. #
  836. # Spit out arg types/names;
  837. #
  838. for (i = 0; i < nvars; ++i) {
  839. if (rpc_type[i] == "ID") {
  840. printf("tlong %scl_id;n", args[i]) >> PFILE
  841. printf("\tlong %scl_id;\n", args[i]) >> SEDFILE
  842. }
  843. if (rpc_type[i] == "STRING") {
  844. printf("tchar *%s;n", args[i]) >> PFILE
  845. printf("\tchar *%s;\n", args[i]) >> SEDFILE
  846. }
  847. if (rpc_type[i] == "INT") {
  848. printf("tu_int32_t %s;n", args[i]) >> PFILE
  849. printf("\tu_int32_t %s;\n", args[i]) >> SEDFILE
  850. }
  851. if (rpc_type[i] == "LIST" && list_type[i] == "STRING") {
  852. printf("tchar ** %slist;n", args[i]) >> PFILE
  853. printf("\tchar ** %slist;\n", args[i]) >> SEDFILE
  854. }
  855. if (rpc_type[i] == "LIST" && list_type[i] == "INT") {
  856. printf("tu_int32_t * %slist;n", args[i]) >> PFILE
  857. printf("\tu_int32_t * %slist;\n", 
  858.     args[i]) >> SEDFILE
  859. }
  860. if (rpc_type[i] == "LIST" && list_type[i] == "ID") {
  861. printf("tu_int32_t * %slist;n", args[i]) >> PFILE
  862. printf("\tu_int32_t * %slist;\n", args[i]) 
  863.     >> SEDFILE
  864. }
  865. if (rpc_type[i] == "DBT") {
  866. printf("tu_int32_t %sdlen;n", args[i]) >> PFILE
  867. printf("\tu_int32_t %sdlen;\n", args[i]) >> SEDFILE
  868. printf("tu_int32_t %sdoff;n", args[i]) >> PFILE
  869. printf("\tu_int32_t %sdoff;\n", args[i]) >> SEDFILE
  870. printf("tu_int32_t %sflags;n", args[i]) >> PFILE
  871. printf("\tu_int32_t %sflags;\n", args[i]) >> SEDFILE
  872. printf("tvoid *%sdata;n", args[i]) >> PFILE
  873. printf("\tvoid *%sdata;\n", args[i]) >> SEDFILE
  874. printf("tu_int32_t %ssize;n", args[i]) >> PFILE
  875. printf("\tu_int32_t %ssize;\n", args[i]) >> SEDFILE
  876. }
  877. }
  878. printf("t__%s_reply *replyp;n",name) >> PFILE
  879. printf("\t__%s_reply *replyp;\n",name) >> SEDFILE
  880. if (xdr_free) {
  881. printf("tint * freep;n") >> PFILE
  882. printf("\tint * freep;\n") >> SEDFILE
  883. }
  884. printf("/* END __%s_%d_proc */n", name, msgid) >> PFILE
  885. printf("/* END __%s_%d_proc */n", name, msgid) >> SEDFILE
  886. #
  887. # Function body
  888. #
  889. printf("{n") >> PFILE
  890. printf("tint ret;n") >> PFILE
  891. for (i = 0; i < nvars; ++i) {
  892. if (rpc_type[i] == "ID") {
  893. printf("t%s %s;n", c_type[i], args[i]) >> PFILE
  894. printf("tct_entry *%s_ctp;n", args[i]) >> PFILE
  895. }
  896. }
  897. printf("n") >> PFILE
  898. for (i = 0; i < nvars; ++i) {
  899. if (rpc_type[i] == "ID") {
  900. printf("tACTIVATE_CTP(%s_ctp, %scl_id, %s);n", 
  901.     args[i], args[i], ctp_type[i]) >> PFILE
  902. printf("t%s = (%s)%s_ctp->ct_anyp;n", 
  903.     args[i], c_type[i], args[i]) >> PFILE
  904. }
  905. }
  906. printf("nt/*nt * XXX Code goes herent */nn") >> PFILE
  907. printf("treplyp->status = ret;n") >> PFILE
  908. printf("treturn;n") >> PFILE
  909. printf("}nn") >> PFILE
  910. #
  911. # If we don't want client code generated, go on to next.
  912. #
  913. if (gen_code == 0)
  914. next;
  915. #
  916. # =====================================================
  917. # Generate Client code
  918. #
  919. # If we are doing a list, spit out prototype decl.
  920. #
  921. for (i = 0; i < nvars; i++) {
  922. if (rpc_type[i] != "LIST")
  923. continue;
  924. printf("static int __dbcl_%s_%slist __P((", 
  925.     name, args[i]) >> CFILE
  926. printf("__%s_%slist **, ", name, args[i]) >> CFILE
  927. if (list_type[i] == "STRING")
  928. printf("%s));n", c_type[i]) >> CFILE
  929. if (list_type[i] == "INT")
  930. printf("u_int32_t));n") >> CFILE
  931. if (list_type[i] == "ID")
  932. printf("%s));n", c_type[i]) >> CFILE
  933. printf("static void __dbcl_%s_%sfree __P((", 
  934.     name, args[i]) >> CFILE
  935. printf("__%s_%slist **));n", name, args[i]) >> CFILE
  936. }
  937. #
  938. # Spit out PUBLIC prototypes.
  939. #
  940. printf("int __dbcl_%s __P((",name) >> CHFILE
  941. sep = "";
  942. for (i = 0; i < nvars; ++i) {
  943. printf("%s%s", sep, pr_type[i]) >> CHFILE
  944. sep = ", ";
  945. }
  946. printf("));n") >> CHFILE
  947. #
  948. # Spit out function name/args.
  949. #
  950. printf("intn") >> CFILE
  951. printf("__dbcl_%s(", name) >> CFILE
  952. sep = "";
  953. for (i = 0; i < nvars; ++i) {
  954. printf("%s%s", sep, args[i]) >> CFILE
  955. sep = ", ";
  956. }
  957. printf(")n") >> CFILE
  958. for (i = 0; i < nvars; ++i)
  959. if (func_arg[i] == 0)
  960. printf("t%s %s;n", c_type[i], args[i]) >> CFILE
  961. else
  962. printf("t%s;n", c_type[i]) >> CFILE
  963. printf("{n") >> CFILE
  964. printf("tCLIENT *cl;n") >> CFILE
  965. printf("t__%s_msg req;n", name) >> CFILE
  966. printf("tstatic __%s_reply *replyp = NULL;n", name) >> CFILE;
  967. printf("tint ret;n") >> CFILE
  968. if (!env_handle)
  969. printf("tDB_ENV *dbenv;n") >> CFILE
  970. printf("n") >> CFILE
  971. printf("tret = 0;n") >> CFILE
  972. if (!env_handle) {
  973. printf("tdbenv = NULL;n") >> CFILE
  974. if (db_handle)
  975. printf("tdbenv = %s->dbenv;n", args[db_idx]) >> CFILE
  976. else if (dbc_handle)
  977. printf("tdbenv = %s->dbp->dbenv;n", 
  978.     args[dbc_idx]) >> CFILE
  979. else if (txn_handle)
  980. printf("tdbenv = %s->mgrp->dbenv;n", 
  981.     args[txn_idx]) >> CFILE
  982. printf("tif (dbenv == NULL || dbenv->cl_handle == NULL) {n") 
  983.     >> CFILE
  984. printf("tt__db_err(dbenv, "No server environment.");n") 
  985.     >> CFILE
  986. } else {
  987. printf("tif (%s == NULL || %s->cl_handle == NULL) {n", 
  988.     args[env_idx], args[env_idx]) >> CFILE
  989. printf("tt__db_err(%s, "No server environment.");n", 
  990.     args[env_idx]) >> CFILE
  991. }
  992. printf("ttreturn (DB_NOSERVER);n") >> CFILE
  993. printf("t}n") >> CFILE
  994. printf("n") >> CFILE
  995. #
  996. # Free old reply if there was one.
  997. #
  998. printf("tif (replyp != NULL) {n") >> CFILE
  999. printf("ttxdr_free((xdrproc_t)xdr___%s_reply, (void *)replyp);n", 
  1000.     name) >> CFILE
  1001. printf("ttreplyp = NULL;nt}n") >> CFILE
  1002. if (!env_handle)
  1003. printf("tcl = (CLIENT *)dbenv->cl_handle;n") >> CFILE
  1004. else
  1005. printf("tcl = (CLIENT *)%s->cl_handle;n", 
  1006.     args[env_idx]) >> CFILE
  1007. printf("n") >> CFILE
  1008. #
  1009. # If there is a function arg, check that it is NULL
  1010. #
  1011. for (i = 0; i < nvars; ++i) {
  1012. if (func_arg[i] != 1)
  1013. continue;
  1014. printf("tif (%s != NULL) {n", args[i]) >> CFILE
  1015. printf("tt__db_err(%s, ", args[env_idx]) >> CFILE
  1016. printf(""User functions not supported in RPC.");n") >> CFILE
  1017. printf("ttreturn (EINVAL);nt}n") >> CFILE
  1018. }
  1019. #
  1020. # Compose message components
  1021. #
  1022. for (i = 0; i < nvars; ++i) {
  1023. if (rpc_type[i] == "ID") {
  1024. printf("tif (%s == NULL)n", args[i]) >> CFILE
  1025. printf("ttreq.%scl_id = 0;ntelsen", 
  1026.     args[i]) >> CFILE
  1027. if (c_type[i] == "DB_TXN *") {
  1028. printf("ttreq.%scl_id = %s->txnid;n", 
  1029.     args[i], args[i]) >> CFILE
  1030. } else {
  1031. printf("ttreq.%scl_id = %s->cl_id;n", 
  1032.     args[i], args[i]) >> CFILE
  1033. }
  1034. }
  1035. if (rpc_type[i] == "INT") {
  1036. printf("treq.%s = %s;n", args[i], args[i]) >> CFILE
  1037. }
  1038. if (rpc_type[i] == "STRING") {
  1039. printf("tif (%s == NULL)n", args[i]) >> CFILE
  1040. printf("ttreq.%s = "";n", args[i]) >> CFILE
  1041. printf("telsen") >> CFILE
  1042. printf("ttreq.%s = (char *)%s;n", 
  1043.     args[i], args[i]) >> CFILE
  1044. }
  1045. if (rpc_type[i] == "DBT") {
  1046. printf("treq.%sdlen = %s->dlen;n", 
  1047.     args[i], args[i]) >> CFILE
  1048. printf("treq.%sdoff = %s->doff;n", 
  1049.     args[i], args[i]) >> CFILE
  1050. printf("treq.%sflags = %s->flags;n", 
  1051.     args[i], args[i]) >> CFILE
  1052. printf("treq.%sdata.%sdata_val = %s->data;n", 
  1053.     args[i], args[i], args[i]) >> CFILE
  1054. printf("treq.%sdata.%sdata_len = %s->size;n", 
  1055.     args[i], args[i], args[i]) >> CFILE
  1056. }
  1057. if (rpc_type[i] == "LIST") {
  1058. printf("tif ((ret = __dbcl_%s_%slist(", 
  1059.     name, args[i]) >> CFILE
  1060. printf("&req.%slist, %s)) != 0)n", 
  1061.     args[i], args[i]) >> CFILE
  1062. printf("ttgoto out;n") >> CFILE
  1063. }
  1064. }
  1065. printf("n") >> CFILE
  1066. printf("treplyp = __db_%s_%d(&req, cl);n", name, msgid) >> CFILE
  1067. printf("tif (replyp == NULL) {n") >> CFILE
  1068. if (!env_handle) {
  1069. printf("tt__db_err(dbenv, ") >> CFILE
  1070. printf("clnt_sperror(cl, "Berkeley DB"));n") >> CFILE
  1071. } else {
  1072. printf("tt__db_err(%s, ", args[env_idx]) >> CFILE
  1073. printf("clnt_sperror(cl, "Berkeley DB"));n") >> CFILE
  1074. }
  1075. printf("ttret = DB_NOSERVER;n") >> CFILE
  1076. printf("ttgoto out;n") >> CFILE
  1077. printf("t}n") >> CFILE
  1078. if (ret_code == 0) {
  1079. printf("tret = replyp->status;n") >> CFILE
  1080. } else {
  1081. for (i = 0; i < nvars; ++i) {
  1082. if (rpc_type[i] == "LIST") {
  1083. printf("t__dbcl_%s_%sfree(&req.%slist);n", 
  1084.     name, args[i], args[i]) >> CFILE
  1085. }
  1086. }
  1087. printf("treturn (__dbcl_%s_ret(", name) >> CFILE
  1088. sep = "";
  1089. for (i = 0; i < nvars; ++i) {
  1090. printf("%s%s", sep, args[i]) >> CFILE
  1091. sep = ", ";
  1092. }
  1093. printf("%sreplyp));n", sep) >> CFILE
  1094. }
  1095. printf("out:n") >> CFILE
  1096. for (i = 0; i < nvars; ++i) {
  1097. if (rpc_type[i] == "LIST") {
  1098. printf("t__dbcl_%s_%sfree(&req.%slist);n", 
  1099.     name, args[i], args[i]) >> CFILE
  1100. }
  1101. }
  1102. printf("treturn (ret);n") >> CFILE
  1103. printf("}nn") >> CFILE
  1104. #
  1105. # If we are doing a list, write list functions for op.
  1106. #
  1107. for (i = 0; i < nvars; i++) {
  1108. if (rpc_type[i] != "LIST")
  1109. continue;
  1110. printf("intn__dbcl_%s_%slist(locp, pp)n", 
  1111.     name, args[i]) >> CFILE
  1112. printf("t__%s_%slist **locp;n", name, args[i]) >> CFILE
  1113. if (list_type[i] == "STRING")
  1114. printf("t%s pp;n{nt%s p;n", 
  1115.     c_type[i], c_type[i]) >> CFILE
  1116. if (list_type[i] == "INT")
  1117. printf("tu_int32_t *pp;n{ntu_int32_t *p, *q;n") 
  1118.     >> CFILE
  1119. if (list_type[i] == "ID")
  1120. printf("t%s pp;n{nt%s p;ntu_int32_t *q;n", 
  1121.     c_type[i], c_type[i]) >> CFILE
  1122. printf("tint ret;n") >> CFILE
  1123. printf("t__%s_%slist *nl, **nlp;nn", name, args[i]) >> CFILE
  1124. printf("t*locp = NULL;n") >> CFILE
  1125. printf("tif (pp == NULL)nttreturn (0);n") >> CFILE
  1126. printf("tnlp = locp;n") >> CFILE
  1127. printf("tfor (p = pp; *p != 0; p++) {n") >> CFILE
  1128. printf("ttif ((ret = __os_malloc(NULL, ") >> CFILE
  1129. printf("sizeof(*nl), NULL, nlp)) != 0)n") >> CFILE
  1130. printf("tttgoto out;n") >> CFILE
  1131. printf("ttnl = *nlp;n") >> CFILE
  1132. printf("ttnl->next = NULL;n") >> CFILE
  1133. printf("ttnl->ent.ent_val = NULL;n") >> CFILE
  1134. printf("ttnl->ent.ent_len = 0;n") >> CFILE
  1135. if (list_type[i] == "STRING") {
  1136. printf("ttif ((ret = __os_strdup(NULL, ") >> CFILE
  1137. printf("*p, &nl->ent.ent_val)) != 0)n") >> CFILE
  1138. printf("tttgoto out;n") >> CFILE
  1139. printf("ttnl->ent.ent_len = strlen(*p)+1;n") >> CFILE
  1140. }
  1141. if (list_type[i] == "INT") {
  1142. printf("ttif ((ret = __os_malloc(NULL, ") >> CFILE
  1143. printf("sizeof(%s), NULL, &nl->ent.ent_val)) != 0)n", 
  1144.     c_type[i]) >> CFILE
  1145. printf("tttgoto out;n") >> CFILE
  1146. printf("ttq = (u_int32_t *)nl->ent.ent_val;n") 
  1147.     >> CFILE
  1148. printf("tt*q = *p;n") >> CFILE
  1149. printf("ttnl->ent.ent_len = sizeof(%s);n", 
  1150.     c_type[i]) >> CFILE
  1151. }
  1152. if (list_type[i] == "ID") {
  1153. printf("ttif ((ret = __os_malloc(NULL, ") >> CFILE
  1154. printf("sizeof(u_int32_t),") >> CFILE
  1155. printf(" NULL, &nl->ent.ent_val)) != 0)n") >> CFILE
  1156. printf("tttgoto out;n") >> CFILE
  1157. printf("ttq = (u_int32_t *)nl->ent.ent_val;n") 
  1158.     >> CFILE
  1159. printf("tt*q = (*p)->cl_id;n") >> CFILE
  1160. printf("ttnl->ent.ent_len = sizeof(u_int32_t);n") 
  1161.     >> CFILE
  1162. }
  1163. printf("ttnlp = &nl->next;n") >> CFILE
  1164. printf("t}n") >> CFILE
  1165. printf("treturn (0);n") >> CFILE
  1166. printf("out:n") >> CFILE
  1167. printf("t__dbcl_%s_%sfree(locp);n", name, args[i]) >> CFILE
  1168. printf("treturn (ret);n") >> CFILE
  1169. printf("}nn") >> CFILE
  1170. printf("voidn__dbcl_%s_%sfree(locp)n", name, args[i]) >> CFILE
  1171. printf("t__%s_%slist **locp;n", name, args[i]) >> CFILE
  1172. printf("{n") >> CFILE
  1173. printf("t__%s_%slist *nl, *nl1;nn", name, args[i]) >> CFILE
  1174. printf("tif (locp == NULL)nttreturn;n") >> CFILE
  1175. printf("tfor (nl = *locp; nl != NULL; nl = nl1) {n") >> CFILE
  1176. printf("ttnl1 = nl->next;n") >> CFILE
  1177. printf("ttif (nl->ent.ent_val)n") >> CFILE
  1178. printf("ttt__os_free(nl->ent.ent_val, nl->ent.ent_len);n") 
  1179.     >> CFILE
  1180. printf("tt__os_free(nl, sizeof(*nl));n") >> CFILE
  1181. printf("t}n}nn") >> CFILE
  1182. }
  1183. #
  1184. # Generate Client Template code
  1185. #
  1186. if (ret_code) {
  1187. #
  1188. # If we are doing a list, write prototypes
  1189. #
  1190. for (i = 0; i < rvars; ++i) {
  1191. if (ret_type[i] != "LIST")
  1192. continue;
  1193. if (retlist_type[i] != "STRING" &&
  1194.     retlist_type[i] != "INT" && list_type[i] != "ID")
  1195. continue;
  1196. printf("int __db_%s_%sreplist __P((", 
  1197.     name, retargs[i]) >> TFILE
  1198. printf("__%s_%sreplist, ", 
  1199.     name, retargs[i]) >> TFILE
  1200. if (retlist_type[i] == "STRING") {
  1201. printf("char ***));n") >> TFILE
  1202. }
  1203. if (retlist_type[i] == "INT" ||
  1204.     retlist_type[i] == "ID") {
  1205. printf("u_int32_t **));n") >> TFILE
  1206. }
  1207. printf("void __db_%s_%sfree __P((", 
  1208.     name, retargs[i]) >> TFILE
  1209. if (retlist_type[i] == "STRING")
  1210. printf("char **));n") >> TFILE
  1211. if (retlist_type[i] == "INT" || retlist_type[i] == "ID")
  1212. printf("u_int32_t *));nn") >> TFILE
  1213. }
  1214. printf("int __dbcl_%s_ret __P((", name) >> CHFILE
  1215. sep = "";
  1216. for (i = 0; i < nvars; ++i) {
  1217. printf("%s%s", sep, pr_type[i]) >> CHFILE
  1218. sep = ", ";
  1219. }
  1220. printf("%s__%s_reply *));n", sep, name) >> CHFILE
  1221. printf("intn") >> TFILE
  1222. printf("__dbcl_%s_ret(", name) >> TFILE
  1223. sep = "";
  1224. for (i = 0; i < nvars; ++i) {
  1225. printf("%s%s", sep, args[i]) >> TFILE
  1226. sep = ", ";
  1227. }
  1228. printf("%sreplyp)n",sep) >> TFILE
  1229. for (i = 0; i < nvars; ++i)
  1230. if (func_arg[i] == 0)
  1231. printf("t%s %s;n", c_type[i], args[i]) 
  1232.     >> TFILE
  1233. else
  1234. printf("t%s;n", c_type[i]) >> TFILE
  1235. printf("t__%s_reply *replyp;n", name) >> TFILE;
  1236. printf("{n") >> TFILE
  1237. printf("tint ret;n") >> TFILE
  1238. #
  1239. # Local vars in template
  1240. #
  1241. for (i = 0; i < rvars; ++i) {
  1242. if (ret_type[i] == "ID" || ret_type[i] == "STRING" ||
  1243.     ret_type[i] == "INT" || ret_type[i] == "DBL") {
  1244. printf("t%s %s;n", 
  1245.     retc_type[i], retargs[i]) >> TFILE
  1246. } else if (ret_type[i] == "LIST") {
  1247. if (retlist_type[i] == "STRING")
  1248. printf("tchar **__db_%slist;n", 
  1249.     retargs[i]) >> TFILE
  1250. if (retlist_type[i] == "ID" ||
  1251.     retlist_type[i] == "INT")
  1252. printf("tu_int32_t *__db_%slist;n", 
  1253.     retargs[i]) >> TFILE
  1254. } else {
  1255. printf("t/* %s %s; */n", 
  1256.     ret_type[i], retargs[i]) >> TFILE
  1257. }
  1258. }
  1259. #
  1260. # Client return code
  1261. #
  1262. printf("n") >> TFILE
  1263. printf("tif (replyp->status != 0)n") >> TFILE
  1264. printf("ttreturn (replyp->status);n") >> TFILE
  1265. for (i = 0; i < rvars; ++i) {
  1266. varname = "";
  1267. if (ret_type[i] == "ID") {
  1268. varname = sprintf("%scl_id", retargs[i]);
  1269. }
  1270. if (ret_type[i] == "STRING") {
  1271. varname =  retargs[i];
  1272. }
  1273. if (ret_type[i] == "INT" || ret_type[i] == "DBL") {
  1274. varname =  retargs[i];
  1275. }
  1276. if (ret_type[i] == "DBT") {
  1277. varname = sprintf("%sdata", retargs[i]);
  1278. }
  1279. if (ret_type[i] == "ID" || ret_type[i] == "STRING" ||
  1280.     ret_type[i] == "INT" || ret_type[i] == "DBL") {
  1281. printf("t%s = replyp->%s;n", 
  1282.     retargs[i], varname) >> TFILE
  1283. } else if (ret_type[i] == "LIST") {
  1284. printf("ntif ((ret = __db_%s_%slist(", 
  1285.     name, retargs[i]) >> TFILE
  1286. printf("replyp->%slist, &__db_%slist)) != 0)", 
  1287.     retargs[i], retargs[i]) >> TFILE
  1288. printf("nttreturn (ret);n") >> TFILE
  1289. printf("nt/*n") >> TFILE
  1290. printf("t * XXX Handle listn") >> TFILE
  1291. printf("t */nn") >> TFILE
  1292. printf("t__db_%s_%sfree(__db_%slist);n", 
  1293.     name, retargs[i], retargs[i]) >> TFILE
  1294. } else {
  1295. printf("t/* Handle replyp->%s; */n", 
  1296.     varname) >> TFILE
  1297. }
  1298. }
  1299. printf("nt/*nt * XXX Code goes herent */nn") >> TFILE
  1300. printf("treturn (replyp->status);n") >> TFILE
  1301. printf("}nn") >> TFILE
  1302. #
  1303. # If we are doing a list, write list functions for this op.
  1304. #
  1305. for (i = 0; i < rvars; ++i) {
  1306. if (ret_type[i] != "LIST")
  1307. continue;
  1308. if (retlist_type[i] != "STRING" &&
  1309.     retlist_type[i] != "INT" && list_type[i] != "ID")
  1310. continue;
  1311. printf("intn") >> TFILE
  1312. printf("__db_%s_%sreplist(locp, ppp)n", 
  1313.     name, retargs[i]) >> TFILE
  1314. printf("t__%s_%sreplist *locp;n", 
  1315.     name, retargs[i]) >> TFILE
  1316. if (retlist_type[i] == "STRING") {
  1317. printf("tchar ***ppp;n{n") >> TFILE
  1318. printf("tchar **pp;n") >> TFILE
  1319. }
  1320. if (retlist_type[i] == "INT" ||
  1321.     retlist_type[i] == "ID") {
  1322. printf("tu_int32_t **ppp;n{n") >> TFILE
  1323. printf("tu_int32_t *pp;n") >> TFILE
  1324. }
  1325. printf("tint cnt, ret, size;n") >> TFILE
  1326. printf("t__%s_%sreplist *nl;nn", 
  1327.     name, retargs[i]) >> TFILE
  1328. printf("tfor (cnt = 0, nl = locp; ") >> TFILE
  1329. printf("nl != NULL; cnt++, nl = nl->next)ntt;nn") 
  1330.     >> TFILE
  1331. printf("tif (cnt == 0) {n") >> TFILE
  1332. printf("tt*ppp = NULL;n") >> TFILE
  1333. printf("ttreturn (0);nt}n") >> TFILE
  1334. printf("tsize = sizeof(*pp) * cnt;n") >> TFILE
  1335. printf("tif ((ret = __os_malloc(NULL, ") >> TFILE
  1336. printf("size, NULL, ppp)) != 0)n") >> TFILE
  1337. printf("ttreturn (ret);n") >> TFILE
  1338. printf("tmemset(*ppp, 0, size);n") >> TFILE
  1339. printf("tfor (pp = *ppp, nl = locp; ") >> TFILE
  1340. printf("nl != NULL; nl = nl->next, pp++) {n") >> TFILE
  1341. if (retlist_type[i] == "STRING") {
  1342. printf("ttif ((ret = __os_malloc(NULL, ") 
  1343.     >> TFILE
  1344. printf("nl->ent.ent_len + 1, NULL,") >> TFILE
  1345. printf(" pp)) != 0)n") >> TFILE
  1346. printf("tttgoto out;n") >> TFILE
  1347. printf("ttif ((ret = __os_strdup(") >> TFILE
  1348. printf("NULL, (char *)nl->ent.ent_val,") 
  1349.     >> TFILE
  1350. printf(" pp)) != 0)n") >> TFILE
  1351. printf("tttgoto out;n") >> TFILE
  1352. }
  1353. if (retlist_type[i] == "INT" ||
  1354.     retlist_type[i] == "ID") {
  1355. printf("tt*pp = *(u_int32_t *)") >> TFILE
  1356. printf("nl->ent.ent_val;n") >> TFILE
  1357. }
  1358. printf("t}n") >> TFILE
  1359. printf("treturn (0);n") >> TFILE
  1360. printf("out:n") >> TFILE
  1361. printf("t__db_%s_%sfree(*ppp);n", 
  1362.     name, retargs[i]) >> TFILE
  1363. printf("treturn (ret);n") >> TFILE
  1364. printf("}nn") >> TFILE
  1365. printf("voidn") >> TFILE
  1366. printf("__db_%s_%sfree(pp)n", 
  1367.     name, retargs[i]) >> TFILE
  1368. if (retlist_type[i] == "STRING")
  1369. printf("tchar **pp;n") >> TFILE
  1370. if (retlist_type[i] == "INT" || retlist_type[i] == "ID")
  1371. printf("tu_int32_t *pp;n") >> TFILE
  1372. printf("{n") >> TFILE
  1373. printf("tsize_t size;n") >> TFILE
  1374. if (retlist_type[i] == "STRING")
  1375. printf("tchar **p;nn") >> TFILE
  1376. if (retlist_type[i] == "INT" || retlist_type[i] == "ID")
  1377. printf("tu_int32_t *p;nn") >> TFILE
  1378. printf("tif (pp == NULL)nttreturn;n") >> TFILE
  1379. printf("tsize = sizeof(*p);n") >> TFILE
  1380. printf("tfor (p = pp; *p != 0; p++) {n") >> TFILE
  1381. printf("ttsize += sizeof(*p);n") >> TFILE
  1382. if (retlist_type[i] == "STRING")
  1383. printf("tt__os_free(*p, strlen(*p)+1);n") 
  1384.     >> TFILE
  1385. printf("t}n") >> TFILE
  1386. printf("t__os_free(pp, size);n") >> TFILE
  1387. printf("}nn") >> TFILE
  1388. }
  1389. }
  1390. }
  1391. #
  1392. # split_lines --
  1393. # Add line separators to pretty-print the output.
  1394. function split_lines(is_public) {
  1395. if (argcount > 3) {
  1396. # Reset the counter, remove any trailing whitespace from
  1397. # the separator.
  1398. argcount = 0;
  1399. sub("[  ]$", "", sep)
  1400. if (is_public) {
  1401. printf("%snt", sep) >> SHFILE
  1402. } else {
  1403. printf("%sntt", sep) >> PFILE
  1404. printf("%s\n\t\t", sep) >> SEDFILE
  1405. }
  1406. }
  1407. }