#!/bin/bash
Dir=.
[ $# -gt 0 ] && Dir=$1
cd $Dir
rm -f .glimpse_filenames .glimpse_filenames_index .glimpse_filetimes \
      .glimpse_index .glimpse_messages .glimpse_partitions .glimpse_statistics
find . \
  -name .svn -prune -o  -name rootdisk -prune -o -name  shadows -prune -o -name \*-pak -prune -o \
  -name doxygen -prune -o -type f -print | cut -c3- \
  | /bin/grep -v -E '^tags$|\.glimpse_|\.pdf$|\.o$|\.so$|\.so\.|\.a$|/mapfile$' \
  | while read L ;do
       read -n4 T < "$L"; [[ $T != ?ELF && $T != BZh* && $T != $'\x1f\x8b\x08'* ]] && echo "$L"
    done \
  | glimpseindex-tt -n -F -H $Dir | awk '!/^Indexing /'
echo -n "Creating tags ... "
ctags --recurse --exclude=.svn --exclude=rootdisk --exclude=\*-pak \
      --sort=no --links=no --excmd=number -f - --extra=+fq --totals=yes \
| { X=$(mktemp); rm -f $X; ctags -f $X /dev/null; cat $X -; rm -f $X; } \
| gawk -F '\t' '
      /^!_TAG_FILE_SORTED/ {sub(/[0-9]/, "2")}
      {print} 
      $NF == "F" && $1 ~ /\.h$/ {
        file = $2
        #print "Searching " file " .." >"/dev/stderr"
        lno = 0
        while (getline l <file) {
            lno++
            if (l ~ /^MessageNodeType\(/) {
                split(substr(l, 17), arg, ",")
                tag = gensub(/^ */, "", 1, arg[1]) 
                print tag "\t" file "\t" lno " \"\tt"
                #tags=tags " " tag
                extra++
            }
        }
      }
      $NF == "f" && $1 ~ /:/ && $2 ~ /\.lua$/ {
        npath = split($1, pth, ":")
        print pth[npath] "\t" $2 "\t" $3 "\tf"
      }
      END {print extra+0 " extra tags  added" tags >"/dev/stderr"}
  ' > tags
LC_ALL=C sort --ignore-case -o tags tags
       
echo done
