rem: if (check_inverse(optarg, &invert, NULL, 0)) exit_error(PARAMETER_PROBLEM, "Unexpected `!' after " "--dstlimit-htable-gcinterval");
add: if (check_inverse(argv[optind-1], &invert, &optind, 0)) break;
context: parse(int c, char **argv, int invert, unsigned int *flags,      const struct ipt_entry *entry,      unsigned int *nfcache,      struct ipt_entry_match **match){	struct ipt_dstlimit_info *r = 			(struct ipt_dstlimit_info *)(*match)->data;	unsigned int num;	switch(c) {	case '%':		if (check_inverse(optarg, &invert, NULL, 0))			exit_error(PARAMETER_PROBLEM,				   "Unexpected `!' after --dstlimit");		if (!parse_rate(optarg, &r->cfg.avg))			exit_error(PARAMETER_PROBLEM,				   "bad rate `%s'", optarg);		*flags |= PARAM_LIMIT;		break;	case '$':		if (check_inverse(optarg, &invert, NULL, 0))			exit_error(PARAMETER_PROBLEM,				   "Unexpected `!' after --dstlimit-burst");		if (string_to_number(optarg, 0, 10000, &num) == -1)			exit_error(PARAMETER_PROBLEM,				   "bad --dstlimit-burst `%s'", optarg);		r->cfg.burst = num;		*flags |= PARAM_BURST;		break;	case '&':		if (check_inverse(optarg, &invert, NULL, 0))			exit_error(PARAMETER_PROBLEM,				"Unexpected `!' after --dstlimit-htable-size");		if (string_to_number(optarg, 0, 0xffffffff, &num) == -1)			exit_error(PARAMETER_PROBLEM,				"bad --dstlimit-htable-size: `%s'", optarg);		r->cfg.size = num;		*flags |= PARAM_SIZE;		break;	case '*':		if (check_inverse(optarg, &invert, NULL, 0))			exit_error(PARAMETER_PROBLEM,				"Unexpected `!' after --dstlimit-htable-max");		if (string_to_number(optarg, 0, 0xffffffff, &num) == -1)			exit_error(PARAMETER_PROBLEM,				"bad --dstlimit-htable-max: `%s'", optarg);		r->cfg.max = num;		*flags |= PARAM_MAX;		break;	case '(':		if (check_inverse(optarg, &invert, NULL, 0))			exit_error(PARAMETER_PROBLEM, "Unexpected `!' after "					"--dstlimit-htable-gcinterval");		if (string_to_number(optarg, 0, 0xffffffff, &num) == -1)			exit_error(PARAMETER_PROBLEM,				"bad --dstlimit-htable-gcinterval: `%s'", 				optarg);		/* FIXME: not HZ dependent!! */		r->cfg.gc_interval = num;		*flags |= PARAM_GCINTERVAL;		break;	case ')':		if (check_inverse(optarg, &invert, NULL, 0))			exit_error(PARAMETER_PROBLEM, "Unexpected `!' after " 					"--dstlimit-htable-expire");		if (string_to_number(optarg, 0, 0xffffffff, &num) == -1)			exit_error(PARAMETER_PROBLEM,				"bad --dstlimit-htable-expire: `%s'", optarg);		/* FIXME: not HZ dependent */		r->cfg.expire = num;		*flags |= PARAM_EXPIRE;		break;	case '_':		if (check_inverse(optarg, &invert, NULL, 0))			exit_error(PARAMETER_PROBLEM, "Unexpected `!' after "					"--dstlimit-mode");		if (!strcmp(optarg, "dstip"))			r->cfg.mode = IPT_DSTLIMIT_HASH_DIP;		else if (!strcmp(optarg, "dstip-destport") ||			 !strcmp(optarg, "dstip-dstport"))			r->cfg.mode = IPT_DSTLIMIT_HASH_DIP|IPT_DSTLIMIT_HASH_DPT;		else if (!strcmp(optarg, "srcip-dstip"))			r->cfg.mode = IPT_DSTLIMIT_HASH_SIP|IPT_DSTLIMIT_HASH_DIP;		else if (!strcmp(optarg, "srcip-dstip-destport") ||			 !strcmp(optarg, "srcip-dstip-dstport"))			r->cfg.mode = IPT_DSTLIMIT_HASH_SIP|IPT_DSTLIMIT_HASH_DIP|IPT_DSTLIMIT_HASH_DPT;		else			exit_error(PARAMETER_PROBLEM, 				"bad --dstlimit-mode: `%s'\n", optarg);		*flags |= PARAM_MODE;		break;	case '"':		if (check_inverse(optarg, &invert, NULL, 0))			exit_error(PARAMETER_PROBLEM, "Unexpected `!' after "					"--dstlimit-name");		if (strlen(optarg) == 0)			exit_error(PARAMETER_PROBLEM, "Zero-length name?");		strncpy(r->name, optarg, sizeof(r->name));		*flags |= PARAM_NAME;		break;	default:		return 0;	}	return 1;}