📄 gen_rpc.awk
字号:
printf("\topaque %sdata<>;\n", args[i]) >> XFILE } } printf("};\n") >> XFILE printf("\n") >> XFILE # # Generate the reply message # printf("struct __%s_reply {\n", name) >> XFILE printf("\tint status;\n") >> XFILE for (i = 0; i < rvars; ++i) { if (ret_type[i] == "ID") { printf("\tunsigned int %scl_id;\n", retargs[i]) >> XFILE } if (ret_type[i] == "STRING") { printf("\tstring %s<>;\n", retargs[i]) >> XFILE } if (ret_type[i] == "INT") { printf("\tunsigned int %s;\n", retargs[i]) >> XFILE } if (ret_type[i] == "DBL") { printf("\tdouble %s;\n", retargs[i]) >> XFILE } if (ret_type[i] == "DBT") { printf("\topaque %sdata<>;\n", retargs[i]) >> XFILE } if (ret_type[i] == "LIST") { if (retlist_type[i] == "GID") { printf("\topaque %s<>;\n", retargs[i]) >> XFILE } else { printf("\tunsigned int %s<>;\n", retargs[i]) >> XFILE } } } printf("};\n") >> XFILE endlist[nendlist] = \ sprintf("__%s_reply __DB_%s(__%s_msg) = %d", \ name, name, name, nendlist); nendlist++; # # ===================================================== # Server functions. # # First spit out PUBLIC prototypes for server functions. # p[1] = sprintf("__%s_reply *__db_%s_%d%03d __P((__%s_msg *, struct svc_req *));", name, name, major, minor, name); p[2] = ""; proto_format(p, 0, SFILE); printf("__%s_reply *\n", name) >> SFILE printf("__db_%s_%d%03d(msg, req)\n", name, major, minor) >> SFILE printf("\t__%s_msg *msg;\n", name) >> SFILE; printf("\tstruct svc_req *req;\n", name) >> SFILE; printf("{\n") >> SFILE printf("\tstatic __%s_reply reply; /* must be static */\n", \ name) >> SFILE if (xdr_free) { printf("\tstatic int __%s_free = 0; /* must be static */\n\n", \ name) >> SFILE } printf("\tCOMPQUIET(req, NULL);\n", name) >> SFILE if (xdr_free) { printf("\tif (__%s_free)\n", name) >> SFILE printf("\t\txdr_free((xdrproc_t)xdr___%s_reply, (void *)&reply);\n", \ name) >> SFILE printf("\t__%s_free = 0;\n", name) >> SFILE printf("\n\t/* Reinitialize allocated fields */\n") >> SFILE for (i = 0; i < rvars; ++i) { if (ret_type[i] == "LIST") { printf("\treply.%s.%s_val = NULL;\n", \ retargs[i], retargs[i]) >> SFILE } if (ret_type[i] == "DBT") { printf("\treply.%sdata.%sdata_val = NULL;\n", \ retargs[i], retargs[i]) >> SFILE } } } need_out = 0; # # Compose server proc to call. Decompose message components as args. # printf("\n\t__%s_proc(", name) >> SFILE sep = ""; for (i = 0; i < nvars; ++i) { if (rpc_type[i] == "IGNORE") { continue; } if (rpc_type[i] == "ID") { printf("%smsg->%scl_id", sep, args[i]) >> SFILE } if (rpc_type[i] == "STRING") { printf("%s(*msg->%s == '\\0') ? NULL : msg->%s", \ sep, args[i], args[i]) >> SFILE } if (rpc_type[i] == "GID") { printf("%smsg->%s", sep, args[i]) >> SFILE } if (rpc_type[i] == "INT") { printf("%smsg->%s", sep, args[i]) >> SFILE } if (rpc_type[i] == "LIST") { printf("%smsg->%s.%s_val", \ sep, args[i], args[i]) >> SFILE printf("%smsg->%s.%s_len", \ sep, args[i], args[i]) >> SFILE } if (rpc_type[i] == "DBT") { printf("%smsg->%sdlen", sep, args[i]) >> SFILE sep = ",\n\t "; printf("%smsg->%sdoff", sep, args[i]) >> SFILE printf("%smsg->%sulen", sep, args[i]) >> SFILE printf("%smsg->%sflags", sep, args[i]) >> SFILE printf("%smsg->%sdata.%sdata_val", \ sep, args[i], args[i]) >> SFILE printf("%smsg->%sdata.%sdata_len", \ sep, args[i], args[i]) >> SFILE } sep = ",\n\t "; } printf("%s&reply", sep) >> SFILE if (xdr_free) printf("%s&__%s_free);\n", sep, name) >> SFILE else printf(");\n\n") >> SFILE if (need_out) { printf("\nout:\n") >> SFILE } printf("\treturn (&reply);\n") >> SFILE printf("}\n\n") >> SFILE # # ===================================================== # Generate Procedure Template Server code # # Produce SED file commands if needed at the same time # # Spit out comment, prototype, function name and arg list. # printf("/^\\/\\* BEGIN __%s_proc/,/^\\/\\* END __%s_proc/c\\\n", \ name, name) >> SEDFILE printf("/* BEGIN __%s_proc */\n", name) >> PFILE printf("/* BEGIN __%s_proc */\\\n", name) >> SEDFILE pi = 1; p[pi++] = sprintf("void __%s_proc __P((", name); p[pi++] = ""; for (i = 0; i < nvars; ++i) { if (rpc_type[i] == "IGNORE") continue; if (rpc_type[i] == "ID") { p[pi++] = "long"; p[pi++] = ", "; } if (rpc_type[i] == "STRING") { p[pi++] = "char *"; p[pi++] = ", "; } if (rpc_type[i] == "GID") { p[pi++] = "u_int8_t *"; p[pi++] = ", "; } if (rpc_type[i] == "INT") { p[pi++] = "u_int32_t"; p[pi++] = ", "; } if (rpc_type[i] == "LIST" && list_type[i] == "GID") { p[pi++] = "u_int8_t *"; p[pi++] = ", "; p[pi++] = "u_int32_t"; p[pi++] = ", "; } if (rpc_type[i] == "LIST" && list_type[i] == "INT") { p[pi++] = "u_int32_t *"; p[pi++] = ", "; p[pi++] = "u_int32_t"; p[pi++] = ", "; } if (rpc_type[i] == "LIST" && list_type[i] == "ID") { p[pi++] = "u_int32_t *"; p[pi++] = ", "; p[pi++] = "u_int32_t"; p[pi++] = ", "; } if (rpc_type[i] == "DBT") { p[pi++] = "u_int32_t"; p[pi++] = ", "; p[pi++] = "u_int32_t"; p[pi++] = ", "; p[pi++] = "u_int32_t"; p[pi++] = ", "; p[pi++] = "u_int32_t"; p[pi++] = ", "; p[pi++] = "void *"; p[pi++] = ", "; p[pi++] = "u_int32_t"; p[pi++] = ", "; } } p[pi++] = sprintf("__%s_reply *", name); if (xdr_free) { p[pi++] = ", "; p[pi++] = "int *));"; } else { p[pi++] = ""; p[pi++] = "));"; } p[pi++] = ""; proto_format(p, 1, SEDFILE); printf("void\n") >> PFILE printf("void\\\n") >> SEDFILE printf("__%s_proc(", name) >> PFILE printf("__%s_proc(", name) >> SEDFILE sep = ""; argcount = 0; for (i = 0; i < nvars; ++i) { argcount++; split_lines(); if (argcount == 0) { sep = ""; } if (rpc_type[i] == "IGNORE") continue; if (rpc_type[i] == "ID") { printf("%s%scl_id", sep, args[i]) >> PFILE printf("%s%scl_id", sep, args[i]) >> SEDFILE } if (rpc_type[i] == "STRING") { printf("%s%s", sep, args[i]) >> PFILE printf("%s%s", sep, args[i]) >> SEDFILE } if (rpc_type[i] == "GID") { printf("%s%s", sep, args[i]) >> PFILE printf("%s%s", sep, args[i]) >> SEDFILE } if (rpc_type[i] == "INT") { printf("%s%s", sep, args[i]) >> PFILE printf("%s%s", sep, args[i]) >> SEDFILE } if (rpc_type[i] == "LIST") { printf("%s%s", sep, args[i]) >> PFILE printf("%s%s", sep, args[i]) >> SEDFILE argcount++; split_lines(); if (argcount == 0) { sep = ""; } else { sep = ", "; } printf("%s%slen", sep, args[i]) >> PFILE printf("%s%slen", sep, args[i]) >> SEDFILE } if (rpc_type[i] == "DBT") { printf("%s%sdlen", sep, args[i]) >> PFILE printf("%s%sdlen", sep, args[i]) >> SEDFILE sep = ", "; argcount++; split_lines(); if (argcount == 0) { sep = ""; } else { sep = ", "; } printf("%s%sdoff", sep, args[i]) >> PFILE printf("%s%sdoff", sep, args[i]) >> SEDFILE argcount++; split_lines(); if (argcount == 0) { sep = ""; } else { sep = ", "; } printf("%s%sulen", sep, args[i]) >> PFILE printf("%s%sulen", sep, args[i]) >> SEDFILE argcount++; split_lines(); if (argcount == 0) { sep = ""; } else { sep = ", "; } printf("%s%sflags", sep, args[i]) >> PFILE printf("%s%sflags", sep, args[i]) >> SEDFILE argcount++; split_lines(); if (argcount == 0) { sep = ""; } else { sep = ", "; } printf("%s%sdata", sep, args[i]) >> PFILE printf("%s%sdata", sep, args[i]) >> SEDFILE argcount++; split_lines(); if (argcount == 0) { sep = ""; } else { sep = ", "; } printf("%s%ssize", sep, args[i]) >> PFILE printf("%s%ssize", sep, args[i]) >> SEDFILE } sep = ", "; } printf("%sreplyp",sep) >> PFILE printf("%sreplyp",sep) >> SEDFILE if (xdr_free) { printf("%sfreep)\n",sep) >> PFILE printf("%sfreep)\\\n",sep) >> SEDFILE } else { printf(")\n") >> PFILE printf(")\\\n") >> SEDFILE } # # Spit out arg types/names; # for (i = 0; i < nvars; ++i) { if (rpc_type[i] == "ID") { printf("\tlong %scl_id;\n", args[i]) >> PFILE printf("\\\tlong %scl_id;\\\n", args[i]) >> SEDFILE } if (rpc_type[i] == "STRING") { printf("\tchar *%s;\n", args[i]) >> PFILE printf("\\\tchar *%s;\\\n", args[i]) >> SEDFILE } if (rpc_type[i] == "GID") { printf("\tu_int8_t *%s;\n", args[i]) >> PFILE printf("\\\tu_int8_t *%s;\\\n", args[i]) >> SEDFILE } if (rpc_type[i] == "INT") { printf("\tu_int32_t %s;\n", args[i]) >> PFILE printf("\\\tu_int32_t %s;\\\n", args[i]) >> SEDFILE } if (rpc_type[i] == "LIST" && list_type[i] == "GID") { printf("\tu_int8_t * %s;\n", args[i]) >> PFILE printf("\\\tu_int8_t * %s;\\\n", args[i]) >> SEDFILE } if (rpc_type[i] == "LIST" && list_type[i] == "INT") { printf("\tu_int32_t * %s;\n", args[i]) >> PFILE printf("\\\tu_int32_t * %s;\\\n", \ args[i]) >> SEDFILE printf("\tu_int32_t %ssize;\n", args[i]) >> PFILE printf("\\\tu_int32_t %ssize;\\\n", args[i]) >> SEDFILE } if (rpc_type[i] == "LIST" && list_type[i] == "ID") { printf("\tu_int32_t * %s;\n", args[i]) >> PFILE printf("\\\tu_int32_t * %s;\\\n", args[i]) \ >> SEDFILE } if (rpc_type[i] == "LIST") { printf("\tu_int32_t %slen;\n", args[i]) >> PFILE printf("\\\tu_int32_t %slen;\\\n", args[i]) \ >> SEDFILE } if (rpc_type[i] == "DBT") { printf("\tu_int32_t %sdlen;\n", args[i]) >> PFILE printf("\\\tu_int32_t %sdlen;\\\n", args[i]) >> SEDFILE printf("\tu_int32_t %sdoff;\n", args[i]) >> PFILE printf("\\\tu_int32_t %sdoff;\\\n", args[i]) >> SEDFILE printf("\tu_int32_t %sulen;\n", args[i]) >> PFILE printf("\\\tu_int32_t %sulen;\\\n", args[i]) >> SEDFILE printf("\tu_int32_t %sflags;\n", args[i]) >> PFILE printf("\\\tu_int32_t %sflags;\\\n", args[i]) >> SEDFILE printf("\tvoid *%sdata;\n", args[i]) >> PFILE printf("\\\tvoid *%sdata;\\\n", args[i]) >> SEDFILE printf("\tu_int32_t %ssize;\n", args[i]) >> PFILE printf("\\\tu_int32_t %ssize;\\\n", args[i]) >> SEDFILE } } printf("\t__%s_reply *replyp;\n",name) >> PFILE printf("\\\t__%s_reply *replyp;\\\n",name) >> SEDFILE if (xdr_free) { printf("\tint * freep;\n") >> PFILE printf("\\\tint * freep;\\\n") >> SEDFILE } printf("/* END __%s_proc */\n", name) >> PFILE printf("/* END __%s_proc */\n", name) >> SEDFILE # # Function body # printf("{\n") >> PFILE printf("\tint ret;\n") >> PFILE for (i = 0; i < nvars; ++i) { if (rpc_type[i] == "ID") { printf("\t%s %s;\n", c_type[i], args[i]) >> PFILE printf("\tct_entry *%s_ctp;\n", args[i]) >> PFILE } } printf("\n") >> PFILE for (i = 0; i < nvars; ++i) { if (rpc_type[i] == "ID") { printf("\tACTIVATE_CTP(%s_ctp, %scl_id, %s);\n", \ args[i], args[i], ctp_type[i]) >> PFILE printf("\t%s = (%s)%s_ctp->ct_anyp;\n", \ args[i], c_type[i], args[i]) >> PFILE } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -