def field {
    | split | lines $ARGV[0] | chomp
}

def field_num {
    | split | length -L
}

# 第一引数～最後から二つ目の引数: ループごとに出力したい文字列
# 最後の引数: 文字列ごとにパイプを受け取るブロック
def for(_ARGV) {
    if([ $_ARGV[1] = in ]) {
        print $_ARGV[2..-1] | while (<> |>) {
            |> var $_ARGV[0]

            yeild
        }
    } else {
        raise "for require in at argument number 2"
    }
}

def case(_ARGV) {
    if ([ $_ARGV_size -ge 2 ]) {
        i=1
        while ([ $i -lt $_ARGV_size ]) {
            if ([ $_ARGV[0] -re $_ARGV[$i] ]) {
                yeild $(($i -1))
            }

            ++ i
        }
    }
}

def times(_ARGV) {
    if([ $_ARGV_size != 1 ]) {
        raise "invalid argument of times"
    }

    _i=0
    while([ $_i -lt $_ARGV[0] ]) {
        yeild 0 $_i
        ++ _i
    }
}

def upto(_ARGV) {
    if([ $_ARGV_size != 2 ]) {
        raise "invalid argument of upto"
    }

    _i=$_ARGV[0]
    while([ $_i -le $_ARGV[1] ]) {
        yeild 0 $_i
        ++ _i
    }
}

def downto(_ARGV) {
    if([ $_ARGV_size != 2 ]) {
        raise "invalid argument of downto"
    }

    _i=$_ARGV[0]
    while([ $_i -ge $_ARGV[1] ]) {
        yeild 0 $_i
        -- _i
    }
}

def step(_ARGV) {
    if([ $_ARGV_size != 3 ]) {
        raise "invalid argument of step"
    }

    if([ $_ARGV[2] = 0 ]) {
        raise "invalid argument(step num) of step"
    } elif ([ $_ARGV[2] -gt 0 ]) {
        _i=$_ARGV[0]
        while([ $_i -le $_ARGV[1] ]) {
            yeild 0 $_i
            _i=$(($_i + $_ARGV[2]))
        }
    } else {
        _i=$_ARGV[0]
        while([ $_i -ge $_ARGV[1] ]) {
            yeild 0 $_i
            _i=$(($_i + $_ARGV[2]))
        }
    }
}

def shelp {
    if(which lv > /dev/null && (index -q "$LANG" ja || index -q "$LC_ALL" ja)) {
	if(ls $SAPHIRE_DOCDIR/USAGE.ja.txt) {
	    lv $SAPHIRE_DOCDIR/USAGE.ja.txt
	} elif(ls $SAPHIRE_DOCDIR/USAGE.ja.txt.gz) {
	    zcat $SAPHIRE_DOCDIR/USAGE.ja.txt.gz | lv
        }
    } else {
	if(ls $SAPHIRE_DOCDIR/USAGE.en.txt) {
	    less $SAPHIRE_DOCDIR/USAGE.en.txt
	} elif(ls $SAPHIRE_DOCDIR/USAGE.en.txt.gz) {
	    zcat $SAPHIRE_DOCDIR/USAGE.en.txt.gz | less
        }
    }
}

def smake {
    make %> | tee $SAPHIRE_TMPDIR/smake

    while (true) {
        cat $SAPHIRE_TMPDIR/smake | selector -r | match -g -f \n '^(.+?):(\d+):' | var file number
        if ([ -e $file ] && [ $number -ge 0 ]) {
            vim +$number $file
        } else {
            break
        }
    }

    true # breakで抜けるとリターンコードが２なので０にしておく
}

def sgrep {
    grep -I -n $ARGV< > | tee $SAPHIRE_TMPDIR/kgrep

    if ([ $RCODE = 0 ]) {
        while (true) {
            cat $SAPHIRE_TMPDIR/kgrep | selector -r | match -f \n '^(.+?):(\d+):' | var file number
            if ([ -e $file ] && [ $number -ge 0 ]) {
                vim +$number $file
            } else {
                break
            }
        }
    }

    true # breakで抜けるとリターンコードが２なので0にしておく
}

### デフォルトの環境変数の設定 ###
export PATH=/usr/local/bin:/usr/bin:/bin:$PATH
export MANPATH=/usr/local/man:/usr/share/man:/usr/man:$MANPATH
export INFOPATH=/usr/local/info:/usr/share/info:/usr/info:$INFOPATH

if ([ ! -d $HOME/.saphire ]) {
    mkdir -p $HOME/.saphire
}
chmod 700 $HOME/.saphire

export SAPHIRE_HISTFILE=$HOME/.saphire/history
export SAPHIRE_TMPDIR=$HOME/.saphire/tmp
export SAPHIRE_USERRC=$HOME/.saphire/saphire.sao
export SAPHIRE_HISTSIZE=1000

if ([ ! -d $SAPHIRE_TMPDIR ]) {
    mkdir -p $SAPHIRE_TMPDIR
}
chmod 700 $SAPHIRE_TMPDIR

export whoami="$(whoami|chomp)"
export hostname="$(hostname|chomp)"
export SAPHIRE_PROMPT='print "saphire_shell > "'

kanjicode -w -q         # saphireが処理する漢字コードはUTF8
                        # -w -> utf8 -e -> eucjp -s -> sjis
                        # 影響を受けるのは
                        # ユーザーが入力したコマンドの引数の漢字コード
                        # (スクリプトも含む)
                        # (端末の漢字コードからこの漢字コードに変換される)
                        # 変数の添え字
                        # index, rindex, length, substrなどの内部コマンド
                        # (添え字の数え方がこの漢字コード)

                        # 各内部コマンドには-s, -w, -eなどの引数があり
                        # 個別に処理できますが
                        # このコマンドで指定するしかありません。

linefield -Lu -q        # saphireの入力文字列の改行コードはLF
                        # -Lu -> LF
                        # -Lw -> CRLF
                        # -Lm -> CR
                        # 影響を受けるのは
                        # 読み込みスクリプトの改行コード
                        # (コマンドライン引数のスクリプトやloadなど)
                        # read, varなどの一行を読み込むコマンド
                        # 出力の改行コードは制御はできません。
                        # すべてLFとなります。
                        # 理由としてはlsなどの他の外部コマンドはすべて
                        # 改行コードがLFなので、それに合わせました
                        # 最終的な出力にCRLFなどの改行コードの出力が
                        # 必要な場合はnkfなどでコンバートしてください。


#### スタートメッセージ ####

if([ -n "$SAPHIRE_INTERACTIVE" ]) {
    puts "-+- Welcome to saphire shell -+-"
    puts "run 'shelp' command for saphire help"
}
