int acl_array_delete_obj(ACL_ARRAY *a, void *obj, void (*free_fn)(void *)) { int idx, position, ret; if(a == NULL || obj == NULL) return(-1); position = -1; for(idx = 0; idx < a->count; idx++) { if(a->items[idx] == obj) { position = idx; break; } } if(free_fn != NULL && obj != NULL) free_fn(obj); if(position == -1) /* not found */ return(-1); /* don't need to free the obj in acl_array_delete_idx */ a->items[idx] = NULL; ret = acl_array_delete_idx(a, position, NULL); if(ret < 0) return(-1); return(ret); }
int acl_cfg_parser_delete(ACL_CFG_PARSER *parser, const char *name) { char myname[] = "acl_cfg_parser_delete"; ACL_CFG_LINE *cfg_line = NULL; int i, n, ok = 0, j; if (parser == NULL || name == NULL || *name == 0) { printf("%s: input error\n", myname); return (-1); } if (parser->_cfg_array == NULL) { return (0); } n = acl_array_size(parser->_cfg_array); for (i = 0; i < n; i++) { cfg_line = (ACL_CFG_LINE *) acl_array_index(parser->_cfg_array, i); if (cfg_line == NULL) return (0); if (cfg_line->ncount < 1) continue; if (strcmp(cfg_line->value[0], name) == 0) { ok = 1; break; } } if (ok) { if (cfg_line->pdata == NULL && cfg_line->value != NULL) parser->valid_line--; parser->total_line--; acl_array_delete_idx(parser->_cfg_array, i, _cfg_line_free); n = acl_array_size(parser->_cfg_array); for (j = i; j < n; j++) { cfg_line = (ACL_CFG_LINE *) acl_array_index(parser->_cfg_array, j); if (cfg_line == NULL) break; cfg_line->line_number--; } } return (0); }