精華區beta mud 關於我們 聯絡資訊
有關 tintin++ 陣列... example: #var test 1234 #var test[1234] {Hello, World!} #show {$test[$$test]} -> Hello, World! 這回重寫了 parser 的主要部份... 命名檢查比較嚴格... $ESC[0m 這類變數不再視為 array... 一維陣列和 C 語法類似... $var[1], $myvar[100], $bar[777] 都是合法名稱... 多維可以用 - 隔開註標... 如 $var[1-2-3], $myvar[100-200-300], $bar[777-888]... 基本上除了 array 的部份... 其他已知的問題一點也沒改善... :P #show $1234 還是會得出 234 的結果... 陣列名稱一定是英文... 方框([])內的索引只允許數字與減號(-)... abcd[1], abc[1-2], abc[1-], abc[1--2-] 都是正確的寫法... abcd[1, abc1], abc[-1-2], abc123[1] 則是不正確的寫法... 不過 abc[1-2-3] 這樣的可讀性應該比較高... <patch> 把 variables.c 裡頭整個 substitute_myvars 替換掉... ( tt++ v1.56 & tt++ v1.64 都一樣... ) /* ------------------------ */ /*************************************************************************/ /* copy the arg text into the result-space, but substitute the variables */ /* $<string> with the values they stand for */ /*************************************************************************/ # define OFF_SET( dest, start, end ) \ strncpy( dest, start, end- start ) ; \ dest += end- start ; void substitute_myvars( char *arg, char *result, struct session *ses ) { struct listnode *ln, *tmpvars ; char *varheader, *varbody, *vararray, varname[50] ; int nest= 0 ; tmpvars= ( ses )? ses->myvars: common_myvars ; fflush( stdout ) ; while( *arg ) { if ( *arg == '\\' ) { *result++= *arg++ ; if ( *arg ) *result++= *arg++ ; # ifdef BIG5 } else if ( *arg & 0x80 ) { *result++ = *arg++ ; if ( !*arg ) break ; else *result++ = *arg++ ; # endif } else if ( *arg == '$' ) { varheader= arg ; while ( *++arg == '$' ) ; if (( arg- varheader == nest+ 1 ) && isalpha( *arg )) { varbody= arg ; while ( isalpha( *++arg )) ; strncpy( varname, varbody, arg- varbody ) ; vararray= ( char * )NULL ; if ( *arg == '[' && isdigit(*( arg+ 1 ))) { vararray= arg ; while ( isdigit( *++arg ) || *arg == '-' ) ; if ( *arg == ']' ) { strncpy( &varname[ vararray-varbody ], vararray, ++arg- vararray ) ; varname[ arg-varbody ]= '\0' ; vararray= ( char * )NULL ; } else varname[ vararray-varbody ]= '\0' ; } else varname[ arg-varbody ]= '\0' ; if (( ln= searchnode_list( tmpvars, varname )) != NULL ) { strcpy( result, ln->right ) ; result += strlen( ln->right ) ; if ( vararray ) { OFF_SET( result, vararray, arg ) ; } } else { OFF_SET( result, varheader, arg ) ; } } else { OFF_SET( result, varheader, arg ) ; } } else if ( *arg == DEFAULT_OPEN ) { nest++ ; *result++= *arg++ ; } else if ( *arg == DEFAULT_CLOSE ) { nest--; *result++= *arg++; } else *result++= *arg++ ; } *result='\0'; } /* ------------------------ */ > 有關 tintin++ 陣列... > 這回重寫了 parser 的主要部份... > 命名檢查比較嚴格... > $ESC[0m 這類變數不再視為 array... > 陣列名稱一定是英文... > 方框([])內的索引只允許數字與減號(-)... > abcd[1], abc[1-2], abc[1-], abc[1--2-] 都是正確的寫法... > abcd[1, abc1], abc[-1-2], abc123[1] 則是不正確的寫法... 啊... 有人提到相容性的問題... 這個我想應該還好... 如果 parser 找不出適當的 array name... 會採用一般替換方式... #var test hello #show $test[123 // 錯誤型態... -> hello[123 // 僅取代 $test... #show $test[1234] // 正確型態... -> $test[1234] // 但 $test[1234] 無定義... 「通常」我們都不會寫出 $<var>[<digit>] 之類的變數... 所以原先的 tt++ script 應該多半還能用...