待ってるだけではなんなので、パッチ作ってみました (遅)。
Index: trunk/hspcmp/token.cpp
===================================================================
--- trunk/hspcmp/token.cpp (リビジョン 382)
+++ trunk/hspcmp/token.cpp (作業コピー)
@@ -305,6 +305,47 @@
s3[a]=0;
}
+void CToken::Pickstr_woEscSeq(void)
+{
+ // Strings pick sub (<" .. ">)
+ //
+ int a = 0;
+ unsigned char a1;
+
+ for (;;) {
+ a1 = (unsigned char)*wp;
+ if ( a1 >= 0x81 ) {
+ if ( a1 < 0xA0 || a1 >= 0xE0 ) { // s-jis code
+ s3[a ++] = a1; wp ++;
+ s3[a ++] = *wp; wp ++;
+ continue;
+ }
+ }
+
+ if ( a1 == '\0' ) { wp = NULL; break; }
+#ifdef HSPLINUX
+ if ( a1 == '\n' ) {
+ wp ++;
+ line ++;
+ break;
+ }
+#endif
+ if ( a1 == '\r' ) {
+ wp ++; if ( *wp == '\n' ) wp ++;
+ line ++;
+ break;
+ }
+ if ( a1 == '"' && *(wp + 1) == '>' ) {
+ wp += 2;
+ if ( *wp == '\0' ) wp = NULL;
+ break;
+ }
+
+ s3[a ++] = a1; wp ++;
+ }
+ s3[a] = 0;
+ return;
+}
char *CToken::Pickstr2( char *str )
{
@@ -351,7 +392,6 @@
return (char *)vs;
}
-
int CToken::CheckModuleName( char *name )
{
int a;
@@ -549,7 +589,12 @@
wp++;Pickstr();
return TK_STRING;
}
-
+
+ if ( a1 == '<' && *(wp + 1) == '"' ) { // when "string" without EscSeq
+ wp += 2; Pickstr_woEscSeq();
+ return TK_STRING;
+ }
+
if (a1==0x27) { // when 'char'
wp++;
wp = (unsigned char *)Pickstr2( (char *)wp );
@@ -823,7 +868,7 @@
char *CToken::ExpandStr( char *str, int opt )
{
// 指定文字列をmembufへ展開する
- // opt:0=行末までスキップ/1="まで/2='まで
+ // opt:0=行末までスキップ/1="まで/2='まで/3=">まで
//
int a;
unsigned char *vs;
@@ -834,15 +879,22 @@
sep = 0;
if (opt==1) sep=0x22;
if (opt==2) sep=0x27;
- s3[a++]=sep;
-
+
+ if ( opt == 3 ) {
+ s3[a ++] = '<';
+ s3[a ++] = '"';
+ } else {
+ s3[a ++] = sep;
+ }
+
while(1) {
a1=*vs;
if (a1==0) break;
if (a1==sep) { vs++;break; }
+ if ( opt == 3 && a1 == '"' && *(vs + 1) == '>' ) { vs += 2; break; }
if ((a1<32)&&(a1!=9)) break;
s3[a++]=a1;vs++;
- if (a1==0x5c) { // '\'チェック
+ if ( opt != 3 && a1==0x5c ) { // '\'チェック
s3[a++] = *vs++;
}
if (a1>=129) { // 全角文字チェック
@@ -851,8 +903,13 @@
}
}
}
- s3[a++]=sep;
- s3[a]=0;
+ if ( opt == 3 ) {
+ s3[a ++] = '"';
+ s3[a ++] = '>';
+ } else {
+ s3[a ++] = sep;
+ }
+ s3[a] = '\0';
if ( opt!=0 ) {
if (wrtbuf!=NULL) wrtbuf->PutData( s3, a );
}
@@ -1092,6 +1149,10 @@
*type = TK_STRING;
return ExpandStr( (char *)vs+1, 2 );
}
+ if ( a1 == '<' && *(vs + 1) == '"' ) { // <"〜">
+ *type = TK_STRING;
+ return ExpandStr( (char *)(vs + 2), 3 );
+ }
if (a1=='{') { // {"〜"}
if (vs[1]==0x22) {
if (wrtbuf!=NULL) wrtbuf->PutStr( "{\"" );
Index: trunk/hspcmp/codegen.cpp
===================================================================
--- trunk/hspcmp/codegen.cpp (リビジョン 382)
+++ trunk/hspcmp/codegen.cpp (作業コピー)
@@ -368,6 +368,36 @@
return (char *)vs;
}
+char *CToken::PickStringCG_woEscSeq( char *str )
+{
+ // 指定文字列をスキップして終端コードを付加する
+ // ( <" .. "> )
+ //
+ unsigned char *vs;
+ unsigned char *pp;
+ unsigned char a1;
+ vs = (unsigned char *)str;
+ pp = vs;
+
+ for (;;) {
+ a1 = *vs;
+ if ( a1 == '\0' ) break;
+ if ( a1 == '"' && *(vs + 1) == '>' ) {
+ vs += 2;
+ break;
+ }
+ if ( a1 >= 129 ) { // 全角文字チェック
+ if ( a1 <= 159 || a1 >= 224 ) {
+ *(pp ++) = a1;
+ a1 = *(++ vs);
+ }
+ }
+ vs ++;
+ *(pp ++) = a1;
+ }
+ *pp = '\0';
+ return (char *)vs;
+}
char *CToken::PickStringCG2( char *str, char **strsrc )
{
@@ -492,7 +522,13 @@
ttype = TK_STRING; cg_str = (char *)vs;
return PickStringCG( (char *)vs, 0x22 );
}
-
+
+ if ( a1 == '<' && *(vs + 1) == '"' ) { // <"〜">
+ vs += 2;
+ ttype = TK_STRING; cg_str = (char *)vs;
+ return PickStringCG_woEscSeq( (char *)vs );
+ }
+
if (a1=='{') { // {"〜"}
if (vs[1]==0x22) {
vs+=2;
Index: trunk/hspcmp/token.h
===================================================================
--- trunk/hspcmp/token.h (リビジョン 382)
+++ trunk/hspcmp/token.h (作業コピー)
@@ -195,6 +195,7 @@
// For preprocess
//
void Pickstr( void );
+ void Pickstr_woEscSeq(void); // without escape seaquence
char *Pickstr2( char *str );
void Calc_token( void );
void Calc_factor( CALCVAR &v );
@@ -292,6 +293,7 @@
char *GetSymbolCG( char *str );
char *GetLineCG( void );
char *PickStringCG( char *str, int sep );
+ char *PickStringCG_woEscSeq( char *str );
char *PickStringCG2( char *str, char **strsrc );
char *PickLongStringCG( char *str );
int PickNextCodeCG( void );
Index: trunk/hsp3/win32gui/hsp3win.cpp
===================================================================
--- trunk/hsp3/win32gui/hsp3win.cpp (リビジョン 382)
+++ trunk/hsp3/win32gui/hsp3win.cpp (作業コピー)
@@ -153,7 +153,16 @@
int tick;
while(1) {
-
+ // Window-Message 処理前
+ if ( hspctx->runmode == RUNMODE_LOGMES ) {
+ hspctx->runmode = RUNMODE_RUN;
+#ifdef HSPDEBUG
+ if ( h_dbgwin != NULL ) dbgnotice( dbginfo, 1, 0, 0 ); // Debug Window Notice
+#endif
+ return;
+ }
+
+ // Window-Message を処理する
if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
if (msg.message == WM_QUIT ) throw HSPERR_NONE;
hsp3win_dispatch( &msg );
@@ -177,6 +186,7 @@
case RUNMODE_WAIT:
tick = GetTickCount();
hspctx->runmode = code_exec_wait( tick );
+ // break fall;
case RUNMODE_AWAIT:
tick = GetTickCount();
if ( code_exec_await( tick ) != RUNMODE_RUN ) {
@@ -201,12 +211,7 @@
hsp3win_debugopen();
#endif
break;
- case RUNMODE_LOGMES:
- hspctx->runmode = RUNMODE_RUN;
-#ifdef HSPDEBUG
- if ( h_dbgwin != NULL ) dbgnotice( dbginfo, 1, 0, 0 ); // Debug Window Notice
-#endif
- return;
+ case RUNMODE_LOGMES: // 処理済み
default:
return;
}
Index: trunk/hsp3/win32gui/hsp3gr_wingui.cpp
===================================================================
--- trunk/hsp3/win32gui/hsp3gr_wingui.cpp (リビジョン 382)
+++ trunk/hsp3/win32gui/hsp3gr_wingui.cpp (作業コピー)
@@ -1600,6 +1600,7 @@
switch( prm ) {
case 0x40:
ptr = &ctx->stat;
+ size = sizeof(int);
break;
case 0x41:
ptr = ctx->refstr;
@@ -1728,7 +1729,7 @@
//
code_adddbg( "ディレクトリ", getdir(0) );
code_adddbg( "コマンドライン", getdir(4) );
- code_adddbg( "ウインドゥ最大", wnd->GetBmscrMax() );
- code_adddbg( "カレントウインドゥ", cur_window );
+ code_adddbg( "ウインドウ最大", wnd->GetBmscrMax() );
+ code_adddbg( "カレントウインドウ", cur_window );
}
#endif