summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaru <haru@dotalux.com>2013-09-15 20:24:41 +0200
committerHaru <haru@dotalux.com>2013-11-28 02:35:01 +0100
commit09dd2097b77bf3dda4c5eb1ee6eb2a60f05bbec8 (patch)
tree5864b4bdae94373089b2de7c9b7ec986b033a235
parent9a802b9147221ec1f31109242be2919f53401fd3 (diff)
downloadhercules-09dd2097b77bf3dda4c5eb1ee6eb2a60f05bbec8.tar.gz
hercules-09dd2097b77bf3dda4c5eb1ee6eb2a60f05bbec8.tar.bz2
hercules-09dd2097b77bf3dda4c5eb1ee6eb2a60f05bbec8.tar.xz
hercules-09dd2097b77bf3dda4c5eb1ee6eb2a60f05bbec8.zip
Added support for automatic concatenation of adjacent string literals
- [ This commit is part of a larger script engine related update ] - Adjacent string literals are now automatically concatenated into one string upon parsing. - Adjacent string literals are string literals (i.e. "such as this", with only whitespace (including line breaks and/or comments) between them. For example, the lines: mes "this will be concatenated " /* skipping this comment */ " into one string"; // at parse time will produce an output of "this will be concatenated into one string". - The feature brings parity with other languages (i.e. C), and makes it easier to split long strings in multiple lines, without having to resort to a, slower, run-time string concatenation operator ('+') - Special thanks to Trojal for the idea. Signed-off-by: Haru <haru@dotalux.com>
-rw-r--r--npc/custom/test.txt14
-rw-r--r--src/map/script.c39
2 files changed, 35 insertions, 18 deletions
diff --git a/npc/custom/test.txt b/npc/custom/test.txt
index bfd297f5d..0fffecf73 100644
--- a/npc/custom/test.txt
+++ b/npc/custom/test.txt
@@ -19,6 +19,15 @@ OnCheck:
//end;
}
return;
+OnCheckStr:
+ .@msg$ = getarg(0,"Unknown Error");
+ .@val$ = getarg(1,"");
+ .@ref$ = getarg(2,"");
+ if (.@val$ != .@ref$) {
+ debugmes "Error: "+.@msg$+": '"+.@val$+"' != '"+.@ref$+"'";
+ //end;
+ }
+ return;
OnInit:
// Array subscript
setarray .@a, 3, 2, 1;
@@ -226,6 +235,11 @@ OnInit:
callsub(OnCheck, "Order of <,>,==", .@y);
+ .@x$ = "string "
+ "concatenation" /* test */ " succeeded";
+ callsub(OnCheckStr, "String concatenation", .@x$, "string concatenation succeeded");
+
+
// Bitwise & operator
.@x = (7&4); // 0111 & 0100 --> 0100
.@y = (4&1); // 0100 & 0001 --> 0000
diff --git a/src/map/script.c b/src/map/script.c
index 73aaafab2..007a3a3d3 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -1070,26 +1070,29 @@ const char* parse_simpleexpr(const char *p) {
p=np;
} else if(*p=='"') {
script->addc(C_STR);
- p++;
- while( *p && *p != '"' ) {
- if( (unsigned char)p[-1] <= 0x7e && *p == '\\' ) {
- char buf[8];
- size_t len = sv->skip_escaped_c(p) - p;
- size_t n = sv->unescape_c(buf, p, len);
- if( n != 1 )
- ShowDebug("parse_simpleexpr: unexpected length %d after unescape (\"%.*s\" -> %.*s)\n", (int)n, (int)len, p, (int)n, buf);
- p += len;
- script->addb(*buf);
- continue;
- } else if( *p == '\n' ) {
- disp_error_message("parse_simpleexpr: unexpected newline @ string",p);
+ do {
+ p++;
+ while( *p && *p != '"' ) {
+ if( (unsigned char)p[-1] <= 0x7e && *p == '\\' ) {
+ char buf[8];
+ size_t len = sv->skip_escaped_c(p) - p;
+ size_t n = sv->unescape_c(buf, p, len);
+ if( n != 1 )
+ ShowDebug("parse_simpleexpr: unexpected length %d after unescape (\"%.*s\" -> %.*s)\n", (int)n, (int)len, p, (int)n, buf);
+ p += len;
+ script->addb(*buf);
+ continue;
+ } else if( *p == '\n' ) {
+ disp_error_message("parse_simpleexpr: unexpected newline @ string",p);
+ }
+ script->addb(*p++);
}
- script->addb(*p++);
- }
- if(!*p)
- disp_error_message("parse_simpleexpr: unexpected end of file @ string",p);
+ if(!*p)
+ disp_error_message("parse_simpleexpr: unexpected end of file @ string",p);
+ p++; //'"'
+ p = script->skip_space(p);
+ } while( *p && *p == '"' );
script->addb(0);
- p++; //'"'
} else {
int l;
const char* pv;