rem: print_ip((struct ip_addr*)exp->r.param);
add: print_ip("", (struct ip_addr*)exp->r.param, "");
context: void print_expr(struct expr* exp){	if (exp==0){		LOG(L_CRIT, "ERROR: print_expr: null expression!\n");		return;	}	if (exp->type==ELEM_T){		switch(exp->l.operand){			case METHOD_O:				DBG("method");				break;			case URI_O:				DBG("uri");				break;			case SRCIP_O:				DBG("srcip");				break;			case SRCPORT_O:				DBG("srcport");				break;			case DSTIP_O:				DBG("dstip");				break;			case NUMBER_O:				break;			case ACTION_O:				print_action((struct action*) exp->r.param);				break;			default:				DBG("UNKNOWN");		}		switch(exp->op){			case EQUAL_OP:				DBG("==");				break;			case MATCH_OP:				DBG("=~");				break;			case NO_OP:				break;			default:				DBG("<UNKNOWN>");		}		switch(exp->subtype){			case NOSUBTYPE: 					DBG("N/A");					break;			case STRING_ST:					DBG("\"%s\"", (char*)exp->r.param);					break;			case NET_ST:					print_net((struct net*)exp->r.param);					break;			case IP_ST:					print_ip((struct ip_addr*)exp->r.param);					break;			case ACTIONS_ST:					print_action((struct action*)exp->r.param);					break;			case NUMBER_ST:					DBG("%d",exp->r.intval);					break;			case MYSELF_ST:					DBG("_myself_");					break;			default:					DBG("type<%d>", exp->subtype);		}	}else if (exp->type==EXP_T){		switch(exp->op){			case AND_OP:					DBG("AND( ");					print_expr(exp->l.expr);					DBG(", ");					print_expr(exp->r.expr);					DBG(" )");					break;			case OR_OP:					DBG("OR( ");					print_expr(exp->l.expr);					DBG(", ");					print_expr(exp->r.expr);					DBG(" )");					break;			case NOT_OP:						DBG("NOT( ");					print_expr(exp->l.expr);					DBG(" )");					break;			default:					DBG("UNKNOWN_EXP ");		}						}else{		DBG("ERROR:print_expr: unknown type\n");	}}