#!/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