return last ? head : node;
}
-list_t *list_remove(list_t *head, list_t *node)
+list_t *list_remove(list_t *head, list_t *node, int freedata)
{
list_t *next = node->next;
list_t *prev = node->prev;
if (next) next->prev = prev;
if (prev) prev->next = next;
+ if (freedata)
+ free(node->data);
free(node);
return head == node ? next : head;
}
}
/* Misc */
+int str2num(char *str, int def)
+{
+ char *end = NULL;
+ int num = strtol(str, &end, 10);
+ return end && *end == '\0' ? num : def;
+}
+
int error(char *fmt, ...)
{
va_list ap;