#! /usr/bin/perl # To be used in an idiomatic pipe for listing all keywords in a codebase: # # find . -name \*.[ch] -exec ctags -x {} \; | ~/src/easel/trunk/devkit/ctags-fix | sort | tbl-pretty -f3 > 00INDEX # # ctags apparently prints a %15s %4d format # on keywords >15 long + linenumbers > 3 digits long, ctags merges the # first two fields, as in: # esl_msa_FormatDesc1221 ./easel/esl_msa.c esl_msa_FormatDesc(ESL_MSA *msa, const char *desc, ...) # We try to detect this as best as possible; the possible ambiguity # is when the keyword name itself ends in a digit. To dismbiguate, we # assume no files have >=10000 lines. # # we also assume ctags has been called in a pipe from 'find', # so all filenames start with './', as in: # find . -name \*.[ch] -exec ctags -x {} \; | ctags-fix > foo # This allows us to unambiguously find the true third column. while (<>) { if (/^(\S{16,})(\d{4})\s+(\.\/.+)$/) { printf("%s %d %s\n", $1, $2, $3); } else { print; } }