Primal-Dual Path-Following Methods For Nonlinear Programming