有關 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 應該多半還能用...