#include "osdialog.h" #include #include #include static char *strndup_better(const char *s, int n) { char *d = malloc(n + 1); memcpy(d, s, n); d[n] = '\0'; return d; } osdialog_filters *osdialog_filters_parse(const char *str) { osdialog_filters *filters_head = malloc(sizeof(osdialog_filters)); filters_head->next = NULL; osdialog_filters *filters = filters_head; osdialog_filter_patterns *patterns = NULL; const char *text = str; while (1) { switch (*str) { case ':': { filters->name = strndup_better(text, str - text); filters->patterns = malloc(sizeof(osdialog_filter_patterns)); patterns = filters->patterns; patterns->next = NULL; text = str + 1; } break; case ',': { assert(patterns); patterns->pattern = strndup_better(text, str - text); patterns->next = malloc(sizeof(osdialog_filter_patterns)); patterns = patterns->next; patterns->next = NULL; text = str + 1; } break; case ';': { assert(patterns); patterns->pattern = strndup_better(text, str - text); filters->next = malloc(sizeof(osdialog_filters)); filters = filters->next; filters->next = NULL; patterns = NULL; text = str + 1; } break; case '\0': { assert(patterns); patterns->pattern = strndup_better(text, str - text); } break; default: break; } if (!*str) break; str++; } return filters_head; } static void patterns_free(osdialog_filter_patterns *patterns) { if (!patterns) return; free(patterns->pattern); osdialog_filter_patterns *next = patterns->next; free(patterns); patterns_free(next); } void osdialog_filters_free(osdialog_filters *filters) { if (!filters) return; free(filters->name); patterns_free(filters->patterns); osdialog_filters *next = filters->next; free(filters); osdialog_filters_free(next); }