http://www.nada.kth.se/~pohl/ppforf.html