check prototypes in src/ as well
[musl-tables] / maketagssrc.sh
diff --git a/maketagssrc.sh b/maketagssrc.sh
new file mode 100755 (executable)
index 0000000..f316785
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+export LC_ALL=C
+MUSL=${MUSL:-../musl}
+
+(
+       cd $MUSL/src
+#      ctags -f /tmp/musl.tags -R -n -u --language-force=c --c-kinds=pxdstuf --fields=k --exclude='*.sh' --exclude='*o' --exclude='*.s' .
+       ctags -f /tmp/musl.tags -R -n -u --language-force=c --c-kinds=xtf --fields=k --exclude='*.sh' --exclude='*o' --exclude='*.s' .
+)
+
+awk -v src=$MUSL/src/ '
+BEGIN {
+       FS="\t"
+}
+function proto(t,f,n) {
+       if (t == "f" && n > 1)
+               n--
+       cmd = "awk '\''NR==" n
+       if (t == "p")
+               cmd = cmd "{s=$0; if(s!~/;/){getline; s=s \" \" $0} print s; exit}"
+       else if (t == "f") {
+               cmd = cmd "{s=$0; sub(/^#.*/,\"\",s); gsub(/\\/\\/.*/,\"\",s); gsub(/.*\\*\\//,\"\",s);"
+               cmd = cmd "while(s!~/{/){getline; s=s \" \" $0} sub(/ *{.*$/,\"\",s); print s; exit}"
+       } else if (t == "d")
+               cmd = cmd "{s=$0; while(gsub(/\\\\$/,\"\",s)){getline; s=s $0} print s; exit}"
+       else
+               return ""
+       cmd = cmd "'\'' " src f
+       cmd | getline s
+       close(cmd)
+       gsub(/\t/, " ", s)
+       gsub(/ +/, " ", s)
+       sub(/^ /,"",s)
+       return s
+}
+/^[^!]/ {
+       gsub(/[^0-9]*/,"",$3)
+       if ($4 == "s")
+               $1 = "struct " $1
+       if ($4 == "u")
+               $1 = "union " $1
+       p = proto($4,$2,$3)
+       if ($4 != "f" || p !~ /static/)
+               print $1 "\t" $2 "\t" $4 "\t" $3 "\t" p
+}' /tmp/musl.tags |sort >data/musl.src.tags
+rm -f /tmp/musl.tags