#include #include "vieter_package_info.h" #define PKG_INFO_STRING(key_ptr, field) \ if ((value_ptr = strstr(value_ptr, key_ptr)) != NULL) { \ value_ptr += strlen(key_ptr); \ tail_ptr = strchr(value_ptr, '\n'); \ tail_ptr[0] = '\0'; \ pkg_info->field = strdup(value_ptr); \ tail_ptr[0] = '\n'; \ } \ value_ptr = tail_ptr; #define PKG_INFO_INT(key_ptr, field) \ value_ptr = strstr(value_ptr, key_ptr) + strlen(key_ptr); \ tail_ptr = strchr(value_ptr, '\n'); \ tail_ptr[0] = '\0'; \ pkg_info->field = atoi(value_ptr); \ tail_ptr[0] = '\n'; \ value_ptr = tail_ptr; #define PKG_INFO_ARRAY(key_ptr, field) \ while ((value_ptr = strstr(value_ptr, key_ptr)) != NULL) { \ value_ptr = value_ptr + strlen(key_ptr); \ tail_ptr = strchr(value_ptr, '\n'); \ tail_ptr[0] = '\0'; \ if (pkg_info->field == NULL) { \ pkg_info->field = vieter_package_dynarray_init(4); \ } \ vieter_package_dynarray_add(pkg_info->field, value_ptr); \ tail_ptr[0] = '\n'; \ value_ptr = tail_ptr; \ } \ value_ptr = tail_ptr; vieter_package_info *vieter_package_info_init() { return calloc(1, sizeof(vieter_package_info)); } void vieter_package_info_free(vieter_package_info *pkg_info) { FREE_STRING(pkg_info->name); FREE_STRING(pkg_info->base); FREE_STRING(pkg_info->version); FREE_STRING(pkg_info->description); FREE_STRING(pkg_info->url); FREE_STRING(pkg_info->arch); FREE_STRING(pkg_info->packager); FREE_STRING(pkg_info->pgpsig); vieter_package_dynarray_free(pkg_info->groups); vieter_package_dynarray_free(pkg_info->licenses); vieter_package_dynarray_free(pkg_info->replaces); vieter_package_dynarray_free(pkg_info->depends); vieter_package_dynarray_free(pkg_info->conflicts); vieter_package_dynarray_free(pkg_info->provides); vieter_package_dynarray_free(pkg_info->optdepends); vieter_package_dynarray_free(pkg_info->makedepends); vieter_package_dynarray_free(pkg_info->checkdepends); free(pkg_info); } void vieter_package_info_parse(vieter_package_info *pkg_info, char *pkg_info_str) { char *value_ptr = pkg_info_str, *tail_ptr = NULL; PKG_INFO_STRING("\npkgname = ", name); PKG_INFO_STRING("\npkgbase = ", base); PKG_INFO_STRING("\npkgver = ", version); PKG_INFO_STRING("\npkgdesc = ", description); PKG_INFO_STRING("\nurl = ", url); PKG_INFO_INT("\nbuilddate = ", build_date); PKG_INFO_STRING("\npackager = ", packager); PKG_INFO_INT("\nsize = ", size); PKG_INFO_STRING("\narch = ", arch); PKG_INFO_ARRAY("\nlicense = ", licenses); PKG_INFO_ARRAY("\nreplaces = ", replaces); PKG_INFO_ARRAY("\ngroup = ", groups); PKG_INFO_ARRAY("\nconflict = ", conflicts); PKG_INFO_ARRAY("\nprovides = ", provides); PKG_INFO_ARRAY("\ndepend = ", depends); PKG_INFO_ARRAY("\noptdepend = ", optdepends); PKG_INFO_ARRAY("\nmakedepend = ", makedepends); PKG_INFO_ARRAY("\ncheckdepend = ", checkdepends); }