robust argument parser