2008年3月29日土曜日

文字列のセンタリング

どう書く?orgより。
文字列の長さに応じて、ifで分岐しています。もっとスマートに記述できないものでしょうか?

/*
    どう書く?org より
        文字列のセンタリング
        http://ja.doukaku.org/87/
*/


#runtime "hsp3cl"
#module
#defcfunc spaces int len
    if len <= 0 : return ""

    sdim s, len + 1
    repeat len
        poke s, cnt' '
    loop
    return s

#defcfunc centered_text str target, int len
    if len <= 0 : return ""

    target_length = strlen(target)
    result = target
    if target_length < len {
        result = spaces((len - target_length)/2) + target + spaces((len - target_length + 1)/2)
    } else : if target_length > len {
        result = strmid(result, (target_length - len)/2, len)
    }
    return result
#global

    s = "*"
    repeat 10
        mes centered_text(s, 15)
        s += " *"
    loop
    stop


追記。
ifによる条件分岐をlimit関数に置き換えました。

/*
    どう書く?org より
        文字列のセンタリング
        http://ja.doukaku.org/87/
*/

#runtime "hsp3cl"

#module
#defcfunc centered_text str _source, int len
    if len <= 0 : return ""
    source = _source

    source_strlen = strlen(source)
    sdim result, len + 1
    memset result, ' ', len
    poke result, limit((len - source_strlen)/20, len/2), strmid(source, limit((source_strlen - len)/20, source_strlen), len)
    return result
#global

    s = "*"
    repeat 10
        mes centered_text(s, 15)
        s += " *"
    loop
    stop

0 件のコメント: