1 /* 2 * Template output. 3 * 4 * Copyright (C) 2019, 2020 Paul Boddie <paul@boddie.org.uk> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License as 8 * published by the Free Software Foundation; either version 2 of 9 * the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA 20 */ 21 22 #pragma once 23 24 /* Filename definitions. */ 25 26 #define client_filename_c "%s/%s_client.c" 27 #define client_filename_cpp "%s/%s_client.cc" 28 #define client_header_filename "%s/%s_client.h" 29 #define compound_interface_type_filename "%s/%s_interface_type.h" 30 #define compound_interfaces_filename "%s/%s_interfaces.h" 31 #define interface_filename "%s/%s_interface.h" 32 #define server_filename_c "%s/%s_server.c" 33 #define server_filename_cpp "%s/%s_server.cc" 34 #define server_header_filename "%s/%s_server.h" 35 36 /* Client templates. */ 37 38 #define client_prologue \ 39 "#include \"%s_client.h\"\n" \ 40 "#include <ipc/message.h>\n" 41 42 #define client_function_body_prologue \ 43 " ipc_message_t msg;\n" \ 44 " long err;\n" 45 46 #define client_function_body_endpoint_conversion_c \ 47 " %s _endp = _self.cap;\n" 48 49 #define client_function_body_call \ 50 "\n ipc_message_request(&msg, %s, %s);\n\n" \ 51 " err = l4_error(msg.tag);\n" \ 52 " if (err)\n" \ 53 " return err;\n" 54 55 /* Client interface definitions for C++. */ 56 57 #define client_interface_prologue_cpp \ 58 " : public %s" 59 60 #define client_interface_endpoint_declaration_cpp \ 61 "\nprotected:\n" \ 62 " %s _endp;\n" 63 64 #define client_interface_constructor_cpp \ 65 "\n %s(%s endp) : _endp(endp) { }\n" 66 67 /* Client interface definitions for C. */ 68 69 #define client_interface_declaration_c \ 70 "\nextern iface_%s client_iface_%s;" 71 72 #define client_interface_prologue_c \ 73 "\niface_%s client_iface_%s = {" 74 75 #define client_interface_member_c \ 76 "\n .%s = %s," 77 78 #define client_interface_epilogue_c \ 79 "\n};\n" 80 81 /* Compound interface dispatcher templates. */ 82 83 #define compound_dispatch_prologue \ 84 "#include \"%s_server.h\"\n" 85 86 #define compound_dispatch_function_prologue \ 87 " long err;\n\n" \ 88 " switch (l4_msgtag_label(msg->tag))\n" \ 89 " {\n" 90 91 #define compound_dispatch_epilogue \ 92 " default:\n" \ 93 " ipc_message_send_error(msg, -L4_EBADPROTO);\n" \ 94 " ipc_message_reply(msg);\n" \ 95 " break;\n" \ 96 " }\n" 97 98 #define compound_dispatch_header_prologue \ 99 "#pragma once\n\n" \ 100 "#include <ipc/message.h>\n" \ 101 "#include \"%s_interface.h\"\n" 102 103 /* Compound interface class definitions. */ 104 105 #define compound_interface_prologue_cpp \ 106 "#pragma once\n\n" \ 107 "#include \"%s_interfaces.h\"\n\n" \ 108 "#ifdef __cplusplus\n\n" \ 109 "class %s :" 110 111 #define compound_interface_prologue_c \ 112 "#pragma once\n\n" \ 113 "#include \"%s_interface_type.h\"\n\n" \ 114 "typedef struct\n" \ 115 "{\n" 116 117 #define compound_interface_epilogue_cpp \ 118 "\n{\n};\n\n" \ 119 "#endif /* __cplusplus */\n" 120 121 #define compound_interface_epilogue_c \ 122 "\n} iface_%s;\n" 123 124 #define compound_interfaces_prologue \ 125 "#pragma once\n\n" 126 127 #define compound_ref_type_definition_prologue_c \ 128 "#pragma once\n\n" \ 129 "#include <l4/sys/types.h>\n" \ 130 "#include \"%s_interfaces.h\"\n\n" \ 131 "typedef union {\n" \ 132 " %s cap;\n" \ 133 " void *ptr;\n" 134 135 #define compound_ref_type_definition_member_c \ 136 " ref_%s as_%s;\n" 137 138 #define compound_ref_type_definition_epilogue_c \ 139 "} ref_%s;\n" 140 141 #define compound_interface_conversion_c \ 142 "\n#define convert_to_%s(_self) (&((%s) {.iface=_self->iface->to_%s, .ref=_self->ref.as_%s}))\n" 143 144 #define compound_interface_conversion_cpp \ 145 "\n#define convert_to_%s(_self) (_self)\n" 146 147 /* Dispatch functions. */ 148 149 #define dispatch_function_signature \ 150 "\nvoid dispatch_%s(ipc_message_t *msg, %s *_self)" 151 152 /* Message handling functions. */ 153 154 #define handle_function_signature \ 155 "\nvoid handle_%s(ipc_message_t *msg, %s *_self)" 156 157 #define handle_function \ 158 " ipc_message_open(msg);\n" \ 159 " dispatch_%s(msg, _self);\n" \ 160 " ipc_message_discard(msg);\n" 161 162 /* General header template. */ 163 164 #define header_prologue \ 165 "#pragma once\n\n" \ 166 "#include <l4/sys/err.h>\n" \ 167 "#include <l4/sys/types.h>\n" 168 169 /* Server templates. */ 170 171 #define server_header_prologue \ 172 "#pragma once\n\n" \ 173 "#include <ipc/message.h>\n" 174 175 #define server_prologue \ 176 "#include \"%s_server.h\"\n" 177 178 /* Server wrapper function templates. */ 179 180 #define server_function_signature \ 181 "\nlong %s_%s(ipc_message_t *msg, %s *_self)" 182 183 #define server_function_body_prologue \ 184 " long err;\n" 185 186 #define server_function_body_unused_message \ 187 "\n (void) msg;\n" 188 189 #define server_function_body_call \ 190 " if (err)\n" \ 191 " return err;\n" 192 193 #define server_function_body_epilogue \ 194 "\n return L4_EOK;\n" 195 196 #define server_completion_function_signature_prologue \ 197 "\nlong complete_%s(l4_cap_idx_t _endp" 198 199 #define server_completion_optional_function_signature_prologue \ 200 "\nlong complete_%s(" 201 202 #define server_completion_function_body_prologue \ 203 " ipc_message_t msg;\n" 204 205 #define server_completion_function_body_epilogue \ 206 "\n ipc_message_send(&msg, %s, %s);\n\n" \ 207 " return l4_error(msg.tag);\n" 208 209 #define server_completion_optional_function_body_epilogue \ 210 "\n ipc_message_reply(&msg);\n\n" \ 211 " return l4_error(msg.tag);\n" 212 213 #define server_initiation_function_body_epilogue \ 214 "\n ipc_message_prepare(msg);\n\n" \ 215 " return L4_EOK;\n" 216 217 /* Server dispatch function templates. */ 218 219 #define server_function_dispatcher_body_epilogue \ 220 " default:\n" \ 221 " ipc_message_send_error(msg, -L4_EBADPROTO);\n" \ 222 " ipc_message_reply(msg);\n" \ 223 " break;\n" \ 224 " }\n" 225 226 /* Interface class definitions. */ 227 228 #define interface_prologue_cpp \ 229 "\n#ifdef __cplusplus\n" \ 230 "\nclass %s" 231 232 #define interface_prologue_c \ 233 "\ntypedef struct" \ 234 235 #define interface_body_begin \ 236 "\n{" 237 238 #define interface_signatures_prologue_cpp \ 239 "\npublic:" 240 241 #define interface_epilogue_cpp \ 242 "};\n\n" \ 243 "#endif /* __cplusplus */\n" 244 245 #define interface_epilogue_c \ 246 "\n} iface_%s;\n" 247 248 #define interface_function_signature_prologue \ 249 "\n%slong %s(" 250 251 #define interface_struct_member_function_signature_prologue \ 252 "\n long (*%s)(" 253 254 #define interface_unimplemented_method_prologue_cpp \ 255 "\n {" 256 257 #define interface_unimplemented_method_epilogue_cpp \ 258 " return -L4_EBADPROTO; }\n" 259 260 #define interface_unused_parameter \ 261 " (void) %s;" 262 263 /* Reference and object type definitions for interfaces. */ 264 265 #define ref_type_definition_c \ 266 "\ntypedef union { %s cap; void *ptr; } ref_%s;\n" 267 268 #define object_type_definition_c \ 269 "\ntypedef struct\n" \ 270 "{\n" \ 271 " ref_%s ref;\n" \ 272 " iface_%s *iface;\n" \ 273 "\n} %s;\n" 274 275 #define expected_items_definition \ 276 "\n#define %s_expected_items %d\n" 277 278 /* Opcode definitions. */ 279 280 #define opcode_enumeration_prologue \ 281 "\nenum opcodes_%s\n{\n" 282 283 #define opcode_identifier \ 284 " opcode_%s_%s" 285 286 #define opcode_enumeration_epilogue \ 287 "};\n" 288 289 /* Message structure definitions. */ 290 291 #define structure_prologue \ 292 "\nstruct %s_words_%s\n{\n" 293 294 #define structure_opcode_member \ 295 " %s _op;\n" 296 297 #define structure_epilogue \ 298 "};\n" 299 300 /* Message access templates. */ 301 302 #define message_accessor_declaration \ 303 " struct %s_words_%s *%s_words;\n" 304 305 #define message_accessor_initialisation \ 306 "\n %s_words = (struct %s_words_%s *)" 307 308 #define message_accessor_reading_initialiser \ 309 " ipc_message_get_word_address(%smsg, 0);\n" 310 311 #define message_accessor_writing_initialiser \ 312 " ipc_message_reserve_words(%smsg, sizeof(struct %s_words_%s));\n" 313 314 /* Dispatch templates. */ 315 316 #define dispatch_function_interface_case \ 317 " case %s:\n" \ 318 " dispatch_%s(msg, %s);\n" \ 319 " break;\n\n" 320 321 #define dispatch_function_wrapper_case \ 322 " case %s:\n" \ 323 " ipc_message_send_error(msg, %s_%s(msg, %s));\n" \ 324 " break;\n\n" 325 326 #define dispatch_function_reply_wrapper_case \ 327 " case %s:\n" \ 328 " err = %s_%s(msg, %s);\n" \ 329 " ipc_message_send_error(msg, err != IPC_MESSAGE_SENT ? err : (long) L4_EOK);\n" \ 330 " if (err != IPC_MESSAGE_SENT)\n" \ 331 " ipc_message_reply(msg);\n" \ 332 " break;\n\n" 333 334 /* Tokens. */ 335 336 #define BEGIN_FUNCTION "\n{\n" 337 #define END_FUNCTION "}\n" 338 339 #define COMPLETE_MEMBER ";\n" 340 #define INDENT_MEMBER " " 341 342 #define COMPLETE_SIGNATURE ";\n" 343 #define END_SIGNATURE "\n" 344 345 /* Texts. */ 346 347 #define help_text \ 348 "Usage: %s [ <options> ] <filename> ...\n\n" \ 349 "Generate source code for the interfaces in the supplied files.\n\n" \ 350 "The following options are supported:\n\n" \ 351 "--all or -a Produce all kinds of output for a given language.\n\n" \ 352 "--client or -c Generate client code.\n\n" \ 353 "--comp or -C Generate a compound/composite/component interface using\n" \ 354 " the given filename prefix.\n\n" \ 355 "--dir or -d Create output in the indicated directory.\n\n" \ 356 "--headers or -h Produce header files.\n\n" \ 357 "--help or -? Show this message.\n\n" \ 358 "--interfaces or -i Produce interface header files.\n\n" \ 359 "--language or -l Generate code in the indicated language.\n\n" \ 360 "--comp-name or -N Indicate the compound/composite/component interface name.\n\n" \ 361 "--routines or -r Produce program routines.\n\n" \ 362 "--server or -s Generate server code.\n\n" \ 363 "--verbose or -v Show verbose output reporting the processed interfaces.\n\n" \ 364 "--version or -V Show version information.\n\n"