crm_free(value_copy);
crm_free(value_copy_start);
test_date_expression(crm_data_t *time_expr){	ha_time_t *start = NULL;	ha_time_t *end = NULL;	const char *value = NULL;	char *value_copy = NULL;	const char *op = crm_element_value(time_expr, "operation");	ha_time_t *now = new_ha_date(TRUE);	crm_data_t *duration_spec = NULL;	crm_data_t *date_spec = NULL;	duration_spec = cl_get_struct(time_expr, "duration");	date_spec = cl_get_struct(time_expr, "date_spec");		value = crm_element_value(time_expr, "start");	if(value != NULL) {		value_copy = crm_strdup(value);		start = parse_date(&value_copy);		crm_free(value_copy);	}	value = crm_element_value(time_expr, "end");	if(value != NULL) {		value_copy = crm_strdup(value);		end = parse_date(&value_copy);		crm_free(value_copy);	}	if(start != NULL && end == NULL) { 		end = parse_xml_duration(start, duration_spec);	}		if(safe_str_eq(op, "date_spec") || safe_str_eq(op, "in_range")) {		if(start != NULL && compare_date(start, now) > 0) {			return FALSE;		} else if(end != NULL && compare_date(end, now) < 0) {			return FALSE;		}		if(safe_str_eq(op, "in_range")) {			return TRUE;		}		return cron_range_satisfied(now, date_spec);	} else if(safe_str_eq(op, "gt") && compare_date(start, now) < 0) {		return TRUE;	} else if(safe_str_eq(op, "lt") && compare_date(end, now) > 0) {		return TRUE;	} else if(safe_str_eq(op, "eq") && compare_date(start, now) == 0) {		return TRUE;	} else if(safe_str_eq(op, "neq") && compare_date(start, now) != 0) {		return TRUE;	}	return FALSE;}