} while (0) #define SECOND_PASS_ONLY do { \ if (!do_everything) continue; \ } while (0)
} #define SECOND_PASS_ONLY { if (!do_everything) continue; }
int do_cmdline(int argc, char **argv, int do_everything){    int err = 0;    extern char **pty_argv;	       /* declared in pty.c */    /*     * Macros to make argument handling easier.     */#define EXPECTS_ARG do { \    if (--argc <= 0) { \	err = 1; \	fprintf(stderr, "pterm: %s expects an argument\n", p); \    } else \	val = *++argv; \} while (0)#define SECOND_PASS_ONLY do { \    if (!do_everything) continue; \} while (0)    /*     * TODO:     *      * finish -geometry     */    char *val;    while (--argc > 0) {	char *p = *++argv;	if (!strcmp(p, "-fn") || !strcmp(p, "-font")) {	    EXPECTS_ARG;	    SECOND_PASS_ONLY;	    strncpy(cfg.font, val, sizeof(cfg.font));	    cfg.font[sizeof(cfg.font)-1] = '\0';	} else if (!strcmp(p, "-fb")) {	    EXPECTS_ARG;	    SECOND_PASS_ONLY;	    strncpy(cfg.boldfont, val, sizeof(cfg.boldfont));	    cfg.boldfont[sizeof(cfg.boldfont)-1] = '\0';	} else if (!strcmp(p, "-geometry")) {	    int flags, x, y, w, h;	    EXPECTS_ARG;	    SECOND_PASS_ONLY;	    flags = XParseGeometry(val, &x, &y, &w, &h);	    if (flags & WidthValue)		cfg.width = w;	    if (flags & HeightValue)		cfg.height = h;	    /*	     * Apparently setting the initial window position is	     * difficult in GTK 1.2. Not entirely sure why this	     * should be. 2.0 has gtk_window_parse_geometry(),	     * which would help... For the moment, though, I can't	     * be bothered with this.	     */	} else if (!strcmp(p, "-sl")) {	    EXPECTS_ARG;	    SECOND_PASS_ONLY;	    cfg.savelines = atoi(val);	} else if (!strcmp(p, "-fg") || !strcmp(p, "-bg") ||		   !strcmp(p, "-bfg") || !strcmp(p, "-bbg") ||		   !strcmp(p, "-cfg") || !strcmp(p, "-cbg")) {	    GdkColor col;	    EXPECTS_ARG;	    SECOND_PASS_ONLY;	    if (!gdk_color_parse(val, &col)) {		err = 1;		fprintf(stderr, "pterm: unable to parse colour \"%s\"\n", val);	    } else {		int index;		index = (!strcmp(p, "-fg") ? 0 :			 !strcmp(p, "-bg") ? 2 :			 !strcmp(p, "-bfg") ? 1 :			 !strcmp(p, "-bbg") ? 3 :			 !strcmp(p, "-cfg") ? 4 :			 !strcmp(p, "-cbg") ? 5 : -1);		assert(index != -1);		cfg.colours[index][0] = col.red / 256;		cfg.colours[index][1] = col.green / 256;		cfg.colours[index][2] = col.blue / 256;	    }	} else if (!strcmp(p, "-e")) {	    /* This option swallows all further arguments. */	    if (!do_everything)		break;	    if (--argc > 0) {		int i;		pty_argv = smalloc((argc+1) * sizeof(char *));		++argv;		for (i = 0; i < argc; i++)		    pty_argv[i] = argv[i];		pty_argv[argc] = NULL;		break;		       /* finished command-line processing */	    } else		err = 1, fprintf(stderr, "pterm: -e expects an argument\n");	} else if (!strcmp(p, "-T")) {	    EXPECTS_ARG;	    SECOND_PASS_ONLY;	    strncpy(cfg.wintitle, val, sizeof(cfg.wintitle));	    cfg.wintitle[sizeof(cfg.wintitle)-1] = '\0';	} else if (!strcmp(p, "-log")) {	    EXPECTS_ARG;	    SECOND_PASS_ONLY;	    strncpy(cfg.logfilename, val, sizeof(cfg.logfilename));	    cfg.logfilename[sizeof(cfg.logfilename)-1] = '\0';	    cfg.logtype = LGTYP_DEBUG;	} else if (!strcmp(p, "-ut-") || !strcmp(p, "+ut")) {	    SECOND_PASS_ONLY;	    cfg.stamp_utmp = 0;	} else if (!strcmp(p, "-ut")) {	    SECOND_PASS_ONLY;	    cfg.stamp_utmp = 1;	} else if (!strcmp(p, "-ls-") || !strcmp(p, "+ls")) {	    SECOND_PASS_ONLY;	    cfg.login_shell = 0;	} else if (!strcmp(p, "-ls")) {	    SECOND_PASS_ONLY;	    cfg.login_shell = 1;	} else if (!strcmp(p, "-nethack")) {	    SECOND_PASS_ONLY;	    cfg.nethack_keypad = 1;	} else if (!strcmp(p, "-sb-") || !strcmp(p, "+sb")) {	    SECOND_PASS_ONLY;	    cfg.scrollbar = 0;	} else if (!strcmp(p, "-sb")) {	    SECOND_PASS_ONLY;	    cfg.scrollbar = 0;	} else if (!strcmp(p, "-name")) {	    EXPECTS_ARG;	    app_name = val;	} else if (!strcmp(p, "-xrm")) {	    EXPECTS_ARG;	    provide_xrm_string(val);	} else if(!strcmp(p, "-help") || !strcmp(p, "--help")) {	    help(stdout);	    exit(0);	    	} else {	    err = 1;	    fprintf(stderr, "pterm: unrecognized option '%s'\n", p);	}    }    return err;}