68user's page 掲示板

Prev< No. 1454> Next  [最新発言に戻る] [過去ログ一覧]
No. 1454 # rosegarden 2000/12/12 (火) 22:59:02
>rosegarden さんは qpopper-2.x 系列を見ておられるよう
>ですが、僕が見たのは qpopper-2.2 (ってこりゃまた古いな)
>の pop_send.c です。
私が見たのは、qpopper-2.3 のソースですね。古いことにはかわりないんですが…。
確かに、
>それはヘッダの出力で、本文はその下の
> /* Send the message body */
> while(fgets(buffer, MAXMSGLINELEN, p->drop)) {
は御指摘の通りです。本質的にソースに差異はありません。でも、
これも結局
#define MAXLINELEN 1024
#define MAXMSGLINELEN MAXLINELEN
なんで、結果的には同じですね。ただし、結果的に同じだっただけで、
私の間違いは間違いです。御指摘ありがとうございます。
なお、上のは同じバージョンの popper.h の define です。
>となっているので (一部略)、fgets で得たデータに改行が
>含まれない場合も、余計な改行は付加されないように思う
>のですがどうでしょう
まず、fgets は man 3 fgets すると
>The fgets() function reads at most one less than the number of characters
>specified by size from the given stream and stores them in the string str.
最大で size で指定された文字から一文字少ない文字をバッファに読み込む
とあります。これは \0 をappendしないといけないからです。
サンプルプログラムを次のようにします。
#include <stdio.h>

int
main( int argc, char **argv )
{
                FILE *fp;
                char buff[256];

                if( argc != 2 ){
                                fprintf( stderr, "usage : fgets FILENAME\n" );
                                exit(1);
                }

                if( ( fp = fopen( argv[1], "r" ) ) == NULL ){
                                fprintf( stderr, "Cannot read %s\n", argv[1] );
                                exit(1);
                }
                while( fgets( buff, 10, fp ) ){
                                puts(buff);
                }
                exit(0);
}
さらにこれを
gcc -g -O -o fgets fgets.c
としてコンパイルして gdb で buff の中を見ます。
(gdb) break 18
Breakpoint 1 at 0x8048604: file fgets.c, line 18.
(gdb) set arg fgets.c
(gdb) run
Starting program: /home/user/tmp/fgets fgets.c

Breakpoint 1, main (argc=2, argv=0xbfbff740) at fgets.c:18
18 while( fgets( buff, 10, fp ) ){
(gdb) display buff
1: buff = "\201\203 (ゴミのため略)
(gdb) n
19 puts(buff);
1: buff = "#include \000\005( 以下ゴミ )
(gdb) q
こんな感じですね。
># 改行なしだと bp==NULL になって fputs("\r\n") は実行されない。
これは違うと思います。bp == NULL なら単に \r\n を append するだけ
で bp != NULL なら \n を \0 で潰してから、\r\n を append だと
思います。良く見てください、元のコードを *bp = '\0' となっています。
bp は index が拾って来た \n のあるところのポインタです。

Prev< No. 1454> Next  [最新発言に戻る] [過去ログ一覧]