三国です
前修正では問題がありました。
以下の修正で、回避策にはなりそうです。
=====input.c=====
・・・・
void shunt_data(FILE *f) {
int notendofb; /* add */
memmove((void *)block_start, (void *)record_start,
(size_t)(block_end - record_start));
notendofb = (block_end - record_start); /* add */
(void)getmoredata(f, block_start + (block_end - record_start),
(size_t)(BLOCKSIZE - (block_end - record_start)));
/* add ->*/
if(*block_start == '\n') {
if(!notendofb) {
debug('C', "CR(%.100s)", block_start+(block_end - record_start));
pos -= record_start - block_start;
record_start = block_start;
pos++;
record_start++;
return;
}
}
/* add <-*/
pos -= record_start - block_start;
record_start = block_start;
}
・・・
=========
Takayuki Matsuki wrote:
> 松木です。
>
(略)
>
> これで現象がなくなったということなら、やはりこの箇所がおかしいという
> ことになるのでしょう。1バイトずつfread()で文字を読んでいけば、確かに
> 三国さんの言われた現象も起きることと思います。しかし必ずしも、この現
> 象が起きていないということは、他の要素も絡んでいるとは思います。
> しかし、今のところの解決方法は分かったわけですね。
>
> debug()関数を入れたということは、DEBUG ONにしたときに、"CR(%.100s)"
> の文字列が出力されるということを確かめられたということですよね?
>
>
"block_start"から始まる"BLOCKSIZE"(32768バイト)のバッファに、
freadしているようです。
行単位のreadでなく、バッファをいっぱいいっぱい使っているので
freadしたときの最後が、改行のCR+LFのうち、CRまでの
片割れまでしか読めないことがあると思います。
次にfreadしたときLFから始まりますので、
このとき、このLF(改行)を"corrupt line"としている場合が
あるような気がします。