長さ0の標準入力と入力終了の判別

岡嶋大介氏の課題(http://okajima.air-nifty.com/b/2010/01/post-abc6.html)に挑戦すべく、D言語で標準入力とリダイレクトのし方を考える。
当初、不肖は

import tango.io.Console;
 
void main()
{
    do{
        char[] buf = Cin.copyln;
        if( buf is null ){
            break;
        } else {
            Cout(">")(buf).newline;
        }
    } while(true);
}

と組んだ。だが、コンソール上で「何も入力せずにリターン」したり、リダイレクトから空行を送ったりすると、Cin.copylnの戻り値がnullになる。上記サンプルでは、Cin.copylnの戻り値がnullになったら終了としているため、これは美味しくない。
そこで不肖が考えたのは、以下の方法。

import tango.io.Console;
 
void main()
{
    do{
        char[] buf = Cin.copyln(true);
        if( buf is null ){
            break;
        } else {
            if( buf[length-1] == '\n' ){
                if( buf[length-2] == '\r') {
                    buf = buf[0..length-2];
                } else {
                    buf = buf[0..length-1];
                }
            }
            Cout(">")(buf).newline;
        }
    } while(true);
}

Cin.copylnにtrueを指定し、改行コードも返してもらう。これで、入力終了をnullとして受け取り、且つ、空行や即リターンを非nullとして受け取ることができた。改行コードの除去処理がステップ数の半分以上を占めるのは許してください……