#!/bin/sh
# vi: ft=awk :
#
# Script to extract functions and external variables off SUS html docs
#
# Copyright (C) 2010 Bernhard Reutner-Fischer
# Public Domain
# Usage:
# wget http://www.opengroup.org/onlinepubs/9699919799/download/susv4.tgz
# tar xzf susv4.tgz
# SUS=susv4 html2input.sh -vFULL_DECLARATIONS=1
# or
# SUS=susv4 html2input.sh -vFULL_DECLARATIONS=0 -vSTDNAME=SUSv4
#
# Bug in time.h.html of SUSv4:
# It inconsistently reads "as variables" instead of "external variables" that
# is used everywhere except in time.h.html
test "x$SUS" = "x" && SUS="susv4"
test "x$AWK" = "x" && AWK="AWK"
test "x$GREP" = "x" && GREP="GREP"
for h in \
$($GREP -l "shall be declared as functions" $SUS/basedefs/*.h.html) \
$($GREP -l "shall declare the following as variables" $SUS/basedefs/*.h.html) \
$($GREP -l "shall declare the following external variables" $SUS/basedefs/*.h.html)
do
$AWK $* '
function get_filename () {
if (NR == 1) {
x=FILENAME
sub(".*/", "", x)
split(x, f , ".")
fname=f[1]
if (STDNAME)
fname=fname "." STDNAME
fname=fname ".in"
printf "" > fname
}
}
function unhtml (l) {
sub("", "", l)
sub("", "", l)
sub("", "", l)
sub("", "", l)
sub("]*>", "", l)
sub("", "", l)
if (l ~ /]*Option[[:space:]][[:space:]]*Start[^>]*>/) {
sub("
]*>", "[Option Start]", l)
} else if (l ~ /
]*Option[[:space:]][[:space:]]*End[^>]*>/) {
sub("
]*>", "[Option End]", l)
}
sub("<.*>", "", l)
return l
}
function get_funcname (l) {
if (FULL_DECLARATIONS)
return l
if (l !~ /;$/)
return l
cnt = split(l, foo, " ")
if (cnt >= 2 && foo[2] ~ /^\(\*/) {
cnt = split(l, foo, "(")
# good enough for signal() and sigset()
if (cnt >= 2)
l=foo[2]
} else {
sub("\\(.*", "", l)
}
gsub("[[\\]\\*]", "", l)
i = split(l, a, " ")
if (i)
l = a[i]
return l
}
function get_varname (l) {
if (FULL_DECLARATIONS)
return l
if (l !~ /;$/)
return l
gsub(",[[:space:]][[:space:]]*", ",", l)
sub(";$", "", l)
i = split(l, a, " ")
if (i)
l = a[i]
gsub("[[\\]\\*]", "", l)
gsub(",", "\n", l)
return l
}
BEGIN{data=0;l=""}
get_filename()
/shall be declared as functions/{data=1;isvar=0;next;}
/shall declare the following as variables/{data=1;isvar=1;next;}
/shall declare the following external variables/{data=1;isvar=1;next;}
/
/{data++;next;} /<\/pre>/{data=0;next;} /.*/{ if (data == 2 && fname) { tmp = $0 sub("^[[:space:]][[:space:]]*", " ", tmp) l = l tmp tmp = unhtml(l) if (!tmp) next l = tmp if (tmp !~ /;$/ && tmp !~ />$/ && tmp !~ /Option Start\]$/ && tmp !~ /Option End\]$/) next if (!isvar) l = get_funcname(l) else l = get_varname(l) if (l) print l >> fname l="" } } ' $h done