diff options
| author | ruki <[email protected]> | 2015-05-14 13:22:11 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2015-05-14 13:22:11 +0800 |
| commit | 914fd0881e2242f01b497650dd09432316aa48d3 (patch) | |
| tree | b3f7d4a008a69e0bf7147c09528e4631e39ae93a /core | |
| parent | 74ece0defa314bab78262d95bee517bdc09df689 (diff) | |
load xproj
Diffstat (limited to 'core')
| -rw-r--r-- | core/pkg/tbox.pkg/inc/mac/x64/tbox.config.h | 2 | ||||
| -rwxr-xr-x | core/pkg/tbox.pkg/inc/tbox/string/static_string.h | 17 | ||||
| -rwxr-xr-x | core/pkg/tbox.pkg/inc/tbox/string/string.h | 17 | ||||
| -rwxr-xr-x | core/src/xmake/preprocessor/load_xproj.c | 128 |
4 files changed, 158 insertions, 6 deletions
diff --git a/core/pkg/tbox.pkg/inc/mac/x64/tbox.config.h b/core/pkg/tbox.pkg/inc/mac/x64/tbox.config.h index 22f02c45d..0617c7331 100644 --- a/core/pkg/tbox.pkg/inc/mac/x64/tbox.config.h +++ b/core/pkg/tbox.pkg/inc/mac/x64/tbox.config.h @@ -14,7 +14,7 @@ #define TB_CONFIG_VERSION_ALTER 8 // build version -#define TB_CONFIG_VERSION_BUILD 201505132122 +#define TB_CONFIG_VERSION_BUILD 201505141040 // small #define TB_CONFIG_SMALL (0) diff --git a/core/pkg/tbox.pkg/inc/tbox/string/static_string.h b/core/pkg/tbox.pkg/inc/tbox/string/static_string.h index 4a8bcd0c9..8f97aeacb 100755 --- a/core/pkg/tbox.pkg/inc/tbox/string/static_string.h +++ b/core/pkg/tbox.pkg/inc/tbox/string/static_string.h @@ -96,6 +96,14 @@ tb_void_t tb_static_string_clear(tb_static_string_ref_t string); */ tb_char_t const* tb_static_string_strip(tb_static_string_ref_t string, tb_size_t n); +/*! trim the left spaces for string + * + * @param string the string + * + * @return the c-string + */ +tb_char_t const* tb_static_string_ltrim(tb_static_string_ref_t string); + /*! trim the right spaces for string * * @param string the string @@ -104,6 +112,15 @@ tb_char_t const* tb_static_string_strip(tb_static_string_ref_t string, tb */ tb_char_t const* tb_static_string_rtrim(tb_static_string_ref_t string); +/*! get the charactor at the given position + * + * @param string the string + * @param p the position + * + * @return the c-string + */ +tb_char_t tb_static_string_charat(tb_static_string_ref_t string, tb_size_t p); + /*! find charactor position * * @param string the string diff --git a/core/pkg/tbox.pkg/inc/tbox/string/string.h b/core/pkg/tbox.pkg/inc/tbox/string/string.h index 1380e62b6..f59bb04ae 100755 --- a/core/pkg/tbox.pkg/inc/tbox/string/string.h +++ b/core/pkg/tbox.pkg/inc/tbox/string/string.h @@ -94,6 +94,14 @@ tb_void_t tb_string_clear(tb_string_ref_t string); */ tb_char_t const* tb_string_strip(tb_string_ref_t string, tb_size_t n); +/*! trim the left spaces for string + * + * @param string the string + * + * @return the c-string + */ +tb_char_t const* tb_string_ltrim(tb_string_ref_t string); + /*! trim the right spaces for string * * @param string the string @@ -102,6 +110,15 @@ tb_char_t const* tb_string_strip(tb_string_ref_t string, tb_size_t n); */ tb_char_t const* tb_string_rtrim(tb_string_ref_t string); +/*! get the charactor at the given position + * + * @param string the string + * @param p the position + * + * @return the c-string + */ +tb_char_t tb_string_charat(tb_string_ref_t string, tb_size_t p); + /*! find charactor position * * @param string the string diff --git a/core/src/xmake/preprocessor/load_xproj.c b/core/src/xmake/preprocessor/load_xproj.c index 1c03d563a..4930f4313 100755 --- a/core/src/xmake/preprocessor/load_xproj.c +++ b/core/src/xmake/preprocessor/load_xproj.c @@ -40,7 +40,16 @@ static tb_char_t const* xm_preprocessor_load_xproj_to_string(tb_stream_ref_t str // check tb_assert_and_check_return_val(stream && string, tb_null); + // init value + tb_string_t value; + if (!tb_string_init(&value)) return tb_null; + + // init temporary value + tb_string_t value_temp; + if (!tb_string_init(&value_temp)) return tb_null; + // done + tb_bool_t is_value = tb_false; tb_bool_t is_values = tb_false; while (!tb_stream_beof(stream)) { @@ -48,16 +57,118 @@ static tb_char_t const* xm_preprocessor_load_xproj_to_string(tb_stream_ref_t str tb_char_t ch = (tb_char_t)tb_stream_bread_u8(stream); if (ch) { - // skip '{' - if (ch == '{') ; - // replace '}' to scopend - else if (ch == '}') tb_string_cstrcat(string, "scopend"); + // is values? + if (is_values) + { + // is value? + if (is_value && ch != ',' && ch != ':' && ch != '{' && ch != '}' && ch != '\r' && ch != '\n') + { + // append to value + tb_string_chrcat(&value, ch); + } + // ',' or ':' or '{' or newline? + else if (ch == ',' || ch == ':' || ch == '{' || ch == '}' || ch == '\r' || ch == '\n') + { + // has value? + if (is_value) + { + // values end? append ')' and newline first + if (ch == ':') tb_string_cstrcat(string, ")\n"); + else + { + // trim the left spaces + tb_string_ltrim(&value); + + // trim the right spaces + tb_string_rtrim(&value); + + // wrap "xxx" + if (tb_string_size(&value)) + { + // it has been "xxx"? only copy it + if (tb_string_charat(&value, 0) == '\"') + tb_string_strcpy(&value_temp, &value); + // wrap it + else + { + tb_string_clear(&value_temp); + tb_string_chrcat(&value_temp, '\"'); + tb_string_strcat(&value_temp, &value); + tb_string_chrcat(&value_temp, '\"'); + } + + // clear value first + tb_string_clear(&value); + + // copy and replace '\"' to "\\"" + tb_char_t const* s = tb_string_cstr(&value_temp); + tb_size_t n = tb_string_size(&value_temp); + tb_size_t i = 0; + for (i = 0; i < n; i++) + { + // replace '\"' to "\\"" + if (i && i != n - 1 && s[i] == '\"') tb_string_cstrcat(&value, "\\\""); + // only copy iy + else tb_string_chrcat(&value, s[i]); + } + } + } + + // append value to string + if (tb_string_size(&value)) tb_string_strcat(string, &value); + + // clear value + tb_string_clear(&value); + + // not value now + is_value = tb_false; + } + + // continue to enter values? onyl replace ':' to '(' + if (ch == ':') tb_string_chrcat(string, '('); + // '{' ? + else if (ch == '{') + { + // not values now + is_values = tb_false; + + // append ')' and newline + tb_string_cstrcat(string, ")\n"); + } + // '}' ? + else if (ch == '}') + { + // not values now + is_values = tb_false; + + // append ')' and replace '}' to scopend + tb_string_cstrcat(string, ")\nscopend()"); + } + // skip newline + else if (ch == '\r' || ch == '\n') ; + // append to string + else tb_string_chrcat(string, ch); + } + else + { + // value now + is_value = tb_true; + + // append to value + tb_string_chrcat(&value, ch); + } + } // enter values? else if (ch == ':') { // values now is_values = tb_true; + + // replace ':' to '(' + tb_string_chrcat(string, '('); } + // replace '}' and newline to scopend + else if (ch == '}') tb_string_cstrcat(string, "\nscopend()"); // append it else tb_string_chrcat(string, ch); } @@ -68,6 +179,12 @@ static tb_char_t const* xm_preprocessor_load_xproj_to_string(tb_stream_ref_t str } } + // exit value + tb_string_exit(&value); + + // exit temporary value + tb_string_exit(&value_temp); + // ok? return tb_string_size(string)? tb_string_cstr(string) : tb_null; } @@ -104,9 +221,10 @@ tb_int_t xm_preprocessor_load_xproj(lua_State* lua) tb_char_t const* xproj = xm_preprocessor_load_xproj_to_string(stream, &string); tb_assert_and_check_break(xproj); - tb_trace_i("%s", xproj); + tb_printf("%s", xproj); // load xmake.xproj string to script + //if (luaL_loadstring(lua, "project(\"console\")\nscopend()")) if (luaL_loadstring(lua, xproj)) { // error |
