public Program read(String[] args) throws Exception {
            if (args.length == 0)
                Util.userError("no input files");
            if (args.length != 1)
                Util.userError("input type \"auto\" accepts only one file at a time.");

            String n = args[0];
            int offset = n.lastIndexOf('.');
            if (offset < 0)
                Util.userError("file " + StringUtil.quote(n) + " does not have an extension");

            String extension = n.substring(offset).toLowerCase();

            ProgramReader reader = null;
            if (".asm".equals(extension))
                reader = new AtmelProgramReader();
            else if (".od".equals(extension))
                reader = new ObjDumpProgramReader();
            else if (".odpp".equals(extension))
                reader = new ObjDump2ProgramReader();
            else if (".elf".equals(extension))
                reader = new ELFParser();

            if ( reader == null ) {
                Util.userError("file extension " + StringUtil.quote(extension) + " unknown");
                return null;
            }

            // TODO: this is a hack; all inherited options should be available
            reader.INDIRECT_EDGES.set(INDIRECT_EDGES.stringValue());
            reader.ARCH.set(ARCH.stringValue());
            reader.options.process(options);
            return reader.read(args);
        }