From 98034d675561423c984b776fb176a430c6ed3c32 Mon Sep 17 00:00:00 2001 From: mquinson Date: Sun, 28 Oct 2007 08:32:07 +0000 Subject: [PATCH] Export the cute little macro that Arnaud devised to ease the bypassing work (and add a pointer to the right example in its new location) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@4928 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- examples/msg/masterslave/masterslave_bypass.c | 78 ++++++++----------- include/surf/surfxml_parse.h | 25 ++++-- 2 files changed, 53 insertions(+), 50 deletions(-) diff --git a/examples/msg/masterslave/masterslave_bypass.c b/examples/msg/masterslave/masterslave_bypass.c index 2ce186e30d..3e475fcaa4 100644 --- a/examples/msg/masterslave/masterslave_bypass.c +++ b/examples/msg/masterslave/masterslave_bypass.c @@ -7,7 +7,7 @@ #include #include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ -#include "surf/surfxml_parse.h" /* to override surf_parse */ +#include "surf/surfxml_parse.h" /* to override surf_parse and bypass the parser */ #include "surf/surfxml.h" /* to hijack surf_parse_lex */ /* Create a log channel to have nice outputs. */ @@ -15,30 +15,18 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,"Messages specific for this msg example"); #define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */ -#define SURFXML_BUFFER_SET(key,val) do { \ - AX_surfxml_##key=AX_ptr; \ - strcpy(A_surfxml_##key,val); \ - AX_ptr+=strlen(val)+1; } while(0) - -#define SURFXML_BUFFER_RESET() do { \ - AX_ptr = 0; \ - memset(surfxml_bufferstack,0,surfxml_bufferstack_size); } while(0) - -#define STAG(tag) STag_surfxml_##tag(); -#define ETAG(tag) do { ETag_surfxml_##tag(); SURFXML_BUFFER_RESET(); } while(0) - static int surf_parse_bypass_platform(void) { - static int AX_ptr; + static int AX_ptr = 0; static int surfxml_bufferstack_size = 2048; - /* allocating memory to the buffer, I think 2MB should be enough */ + /* allocating memory for the buffer, I think 2kB should be enough */ surfxml_bufferstack = xbt_new0(char, surfxml_bufferstack_size); /* */ SURFXML_BUFFER_SET(platform_description_version,"2"); - STAG(platform_description); + SURFXML_START_TAG(platform_description); /* */ SURFXML_BUFFER_SET(host_id,"host A"); @@ -52,8 +40,8 @@ static int surf_parse_bypass_platform(void) SURFXML_BUFFER_SET(host_interference_send_recv, "1.0"); SURFXML_BUFFER_SET(host_max_outgoing_rate, "-1.0"); - STAG(host); - ETAG(host); + SURFXML_START_TAG(host); + SURFXML_END_TAG(host); /* */ SURFXML_BUFFER_SET(host_id, "host B"); @@ -67,8 +55,8 @@ static int surf_parse_bypass_platform(void) SURFXML_BUFFER_SET(host_interference_send_recv, "1.0"); SURFXML_BUFFER_SET(host_max_outgoing_rate, "-1.0"); - STAG(host); - ETAG(host); + SURFXML_START_TAG(host); + SURFXML_END_TAG(host); /* */ SURFXML_BUFFER_SET(link_id, "LinkA"); @@ -79,8 +67,8 @@ static int surf_parse_bypass_platform(void) A_surfxml_link_state = A_surfxml_link_state_ON; SURFXML_BUFFER_SET(link_state_file, ""); A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; - STAG(link); - ETAG(link); + SURFXML_START_TAG(link); + SURFXML_END_TAG(link); /* */ SURFXML_BUFFER_SET(route_src, "host A"); @@ -90,13 +78,13 @@ static int surf_parse_bypass_platform(void) SURFXML_BUFFER_SET(route_impact_on_src_with_other_recv, "0.0"); SURFXML_BUFFER_SET(route_impact_on_dst_with_other_send, "0.0"); - STAG(route); + SURFXML_START_TAG(route); SURFXML_BUFFER_SET(link_c_ctn_id, "LinkA"); - STAG(link_c_ctn); - ETAG(link_c_ctn); + SURFXML_START_TAG(link_c_ctn); + SURFXML_END_TAG(link_c_ctn); - ETAG(route); + SURFXML_END_TAG(route); /* */ SURFXML_BUFFER_SET(route_src, "host B"); @@ -106,15 +94,15 @@ static int surf_parse_bypass_platform(void) SURFXML_BUFFER_SET(route_impact_on_src_with_other_recv, "0.0"); SURFXML_BUFFER_SET(route_impact_on_dst_with_other_send, "0.0"); - STAG(route); + SURFXML_START_TAG(route); SURFXML_BUFFER_SET(link_c_ctn_id, "LinkA"); - STAG(link_c_ctn); - ETAG(link_c_ctn); + SURFXML_START_TAG(link_c_ctn); + SURFXML_END_TAG(link_c_ctn); - ETAG(route); + SURFXML_END_TAG(route); /* */ - ETAG(platform_description); + SURFXML_END_TAG(platform_description); free(surfxml_bufferstack); return 0; @@ -130,48 +118,48 @@ static int surf_parse_bypass_application(void) { /* */ SURFXML_BUFFER_SET(platform_description_version,"2"); - STAG(platform_description); + SURFXML_START_TAG(platform_description); /* */ SURFXML_BUFFER_SET(process_host, "host A"); SURFXML_BUFFER_SET(process_function, "master"); SURFXML_BUFFER_SET(process_start_time, "-1.0"); SURFXML_BUFFER_SET(process_kill_time, "-1.0"); - STAG(process); + SURFXML_START_TAG(process); /* */ SURFXML_BUFFER_SET(argument_value, "20"); - STAG(argument); - ETAG(argument); + SURFXML_START_TAG(argument); + SURFXML_END_TAG(argument); /* */ SURFXML_BUFFER_SET(argument_value, "5000000"); - STAG(argument); - ETAG(argument); + SURFXML_START_TAG(argument); + SURFXML_END_TAG(argument); /* */ SURFXML_BUFFER_SET(argument_value, "100000"); - STAG(argument); - ETAG(argument); + SURFXML_START_TAG(argument); + SURFXML_END_TAG(argument); /* */ SURFXML_BUFFER_SET(argument_value, "host B"); - STAG(argument); - ETAG(argument); + SURFXML_START_TAG(argument); + SURFXML_END_TAG(argument); /* */ - ETAG(process); + SURFXML_END_TAG(process); /* */ SURFXML_BUFFER_SET(process_host, "host B"); SURFXML_BUFFER_SET(process_function, "slave"); SURFXML_BUFFER_SET(process_start_time, "-1.0"); SURFXML_BUFFER_SET(process_kill_time, "-1.0"); - STAG(process); - ETAG(process); + SURFXML_START_TAG(process); + SURFXML_END_TAG(process); /* */ - ETAG(platform_description); + SURFXML_END_TAG(platform_description); free(surfxml_bufferstack); return 0; diff --git a/include/surf/surfxml_parse.h b/include/surf/surfxml_parse.h index 342d25cd9b..779104129a 100644 --- a/include/surf/surfxml_parse.h +++ b/include/surf/surfxml_parse.h @@ -13,11 +13,7 @@ #include "xbt/function_types.h" #include "xbt/dict.h" -/* Entry-point of the surfxml parser. */ -XBT_PUBLIC_DATA(int_f_void_t) surf_parse; - -/* Hook for the different tags. They can be redefined at will whereas - the versions without the _fun can't. */ +/* Hook for the different tags. All the functions which pointer to are push into here are run when the tag is encountered */ XBT_PUBLIC(xbt_dynar_t) STag_surfxml_platform_description_cb_list; XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_platform_description_cb_list; XBT_PUBLIC(xbt_dynar_t) STag_surfxml_host_cb_list; @@ -56,4 +52,23 @@ XBT_PUBLIC(int) surf_parse_get_debug(void); XBT_PUBLIC(void) surf_parse_set_debug(int bdebug); XBT_PUBLIC(int) surf_parse_lex_destroy(void); +/* What is needed to bypass the parser. */ +XBT_PUBLIC_DATA(int_f_void_t) surf_parse; /* Entry-point to the parser. Set this to your function. */ + +/* Set of macros to make the bypassing work easier. + * See examples/msg/masterslave_bypass.c for an example of use */ +#define SURFXML_BUFFER_SET(key,val) do { \ + AX_surfxml_##key=AX_ptr; \ + strcpy(A_surfxml_##key,val); \ + AX_ptr+=strlen(val)+1; } while(0) + +#define SURFXML_BUFFER_RESET() do { \ + AX_ptr = 0; \ + memset(surfxml_bufferstack,0,surfxml_bufferstack_size); } while(0) + +#define SURFXML_START_TAG(tag) STag_surfxml_##tag() +#define SURFXML_END_TAG(tag) do { ETag_surfxml_##tag(); SURFXML_BUFFER_RESET(); } while(0) + + + #endif -- 2.20.1