郑州市卫计委付桂荣:Tex源码笔记(三)

来源:百度文库 编辑:九乡新闻网 时间:2024/03/29 08:58:42

Tex源码笔记(三)


Tex处理用户写入的代码采用的方式是一次读入一行,每次读入后放到缓冲buffer中:
   
    buf_size=500;{缓冲大小}
     buffer: array[0..buf_size]of ASCII_code;{缓冲数组}
    first:0..buf_size;{缓冲中第一个未用元素下标}
    last:0..buf_size;{输入缓冲中的文本行行尾下标}
    max_buf_stack:0..buf_size;{缓冲中使用的最大索引下标}

该数据结构的图示以后上传。

为了理解该数据结构,我们需要看一下Tex是如何使用缓冲的。这就需要看一下Tex中比较重要的一个函数input_ln,该函数用于从目标文件中读入一行:

    {该函数用于从f中读入一行,忽略行尾空格}
     function input_ln(varf:alpha_file;bypass_eoln:boolean):boolean
       varlast_nonblank:0..buf_size;
       begin
         if bypass_eolnthen {跳过换行符}
           if!eof(f) then get(f);
        last=first;
 if eof(f) theninput_ln=false;{文件结束时,返回false}
 else
   beginlast_nonblank=first;{用于跟踪最后一个非空格字符}
     while !eoln(f) do
     begin
if last>=max_buf_size then
  begin max_buf_size=last+1;
    if max_buf_size=buf_size then
                 and abort35>;
  end;
       buffer[last]=xord[f^];get(f);incr(last);
        ifbuffer[last-1]<>' ' thenlast_nonblank=last;
     end;
     last=last_nonblank; input_ln=true;
   end;
end;

我们可以看出:

(1)读入的数据会放在buffer[first]..buffer[last-1];
(2)buffer[last-1]不等于空格。变量last_nonblank用于跟踪最后一个非空格的字符;
(3)该函数当文件结束时返回false,否则返回true;
(4)max_buf_stack用于记录暂时可以提供的最大缓冲下标,当不够用时可以增大,但该值必须严格小于buf_size,这是因为Tex会在读入行的最后添加一个字符,即\endlinechar。

读入一行文本后Tex就可以开始处理该行文本了,在这个过程中变量loc指向当前要处理的字符位置:

   define loc=cur_input.loc_field;

其中变量cur_input为关于当前要处理的文本的一些信息,当然当前要处理的字符位置为该信息之一。显然我们有loc