预处理后再 ctags

由本社区发起的开源项目
回复
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

预处理后再 ctags

#1

帖子 BigSnake.NET » 2008-10-19 11:07

消除万恶的宏给 ctags 造成的障碍

代码: 全选

#!/bin/bash -e
# 预处理后再 ctags
# Written by AutumnCat. 19 Oct, 2008.

help(){
        cat <<END
Usage: cpp-tags.sh [c|cpp|cxx|c++] <filelist >tags
END
}

export LANG=C # 消除 locale 的影响

# select language
case "$1" in
        "c++"|"cxx"|"cpp")
        LANG_KIND='c++'
        ;;
        "c"|"")
        LANG_KIND='c'
        ;;
        "-?"|"-h")
        help
        exit 0
        ;;
        *)
        echo Unknown language: "$1" >&2
        help >&2
        exit 2
        ;;
esac

#TAGS_FILENAME=${TAGS_FILENAME:-'-'}
SORT_CMD=${SORT_CMD:-'sort'}
SORT_OPT=${SORT_OPT:-'-u'}
CPP_CMD=${CPP_CMD:-'cpp'}
CPP_OPT=${CPP_OPT:-"-x $LANG_KIND"}
CTAGS_CMD=${CTAGS_CMD:-'ctags'}
CTAGS_OPT=${CTAGS_OPT:-"-f - --language-force=$LANG_KIND --$LANG_KIND-kinds=+px --fields=+iaS --extra=+q --line-directives=yes -n -u"}
TMP_FILE_NAME=`tempfile -pcpp-tags`
TMP_FILE_DIR=`dirname "$TMP_FILE_NAME"`
TMP_FILE_BASENAME=`basename "$TMP_FILE_NAME"`

make_tag_1(){
        while read i
        do
                "$CPP_CMD" $CPP_OPT "$i" > "$TMP_FILE_NAME" &
                "$CTAGS_CMD" $CTAGS_OPT "$i"
                wait
                pushd "$TMP_FILE_DIR" >/dev/null
                "$CTAGS_CMD" $CTAGS_OPT "$TMP_FILE_BASENAME"
                popd >/dev/null
        done | sort -u
}

gen_pped_code(){
        rm -f "$TMP_FILE_NAME"
        while read i
        do
                "$CPP_CMD" $CPP_OPT "$i" >> "$TMP_FILE_NAME"
        done
}

make_tag_2(){
        (
        tee >(gen_pped_code) | "$CTAGS_CMD" -L - $CTAGS_OPT
        pushd "$TMP_FILE_DIR" >/dev/null
        "$CTAGS_CMD" $CTAGS_OPT "$TMP_FILE_BASENAME"
        popd >/dev/null
        ) | sort -u
}

make_tag_2 # FIXME 不知道为什么 make_tag_1 与 make_tag_2 有时输出不同结果, make_tag_2 貌似好些

rm "$TMP_FILE_NAME"
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
回复