下面是Tex对字符串进行操作的数据结构:str_pool和str_start:
pool_size=32000;
pool_pointer=0..pool_size;
max_strings=3000;
str_number=0..max_strings;
packed_ASCII_code=0..255;{可以将ASCII_code和packed_ASCII_code等同}
str_pool:packed
array[pool_pointer] of packed_ASCII_code;
str_start:array[str_number] of
pool_pointer;
pool_ptr:pool_pointer;
str_ptr:str_number;
其中,str_start用来指示一个字符串开始字符在str_pool中的索引,每个字符串都在str_start中占一个表项。因而,对于两个连续的字符串来说,第一个字符串的结为第二个字符串的开始位置减1,从而
define
length(#)=(str_start[#+1]-str_start[#]);
可以来表示第#个字符串的长度。该数据结构的图示以后给出。
为了保证str_start和str_pool的协调,Tex定义了一些例程来对它们进行操作:
append_char(#)
{添加字符#到str_pool}
flush_pool{删除str_pool中的一个字符}
str_room(#){增加#个字符时候越界?}
make_string:str_number{分配结束的收尾工作,更新str_ptr,str_start[str_ptr]至未使用的索引}
flush_string{删除刚刚分配的字符串}
str_eq_buf(s:str_number;k:integer):boolean
{比较字符串s是否等于buffer中始于k的字符串}
str_eq_str(s,t:str_number):boolean{比较两个字符串s和t是否相等}