1
0
Fork 0
mirror of https://github.com/pygos/pkg-utils.git synced 2024-11-26 06:20:43 +01:00
pkg-utils/main/cmd/pack/desc.c
2019-02-08 11:20:12 +01:00

160 lines
2.8 KiB
C

#include "pack.h"
static int handle_requires(input_file_t *f, void *obj)
{
char *ptr = f->line, *end;
pkg_desc_t *desc = obj;
dependency_t *dep;
size_t len;
while (*ptr != '\0') {
while (isspace(*ptr))
++ptr;
end = ptr;
while (*end != '\0' && !isspace(*end))
++end;
len = end - ptr;
if (len == 0)
break;
if (len > 0xFF) {
input_file_complain(f, "dependency name too long");
return -1;
}
dep = calloc(1, sizeof(*dep) + len + 1);
if (dep == NULL) {
input_file_complain(f, "out of memory");
return -1;
}
memcpy(dep->name, ptr, len);
dep->type = PKG_DEPENDENCY_REQUIRES;
dep->next = desc->deps;
desc->deps = dep;
ptr = end;
}
return 0;
}
static int handle_name(input_file_t *f, void *obj)
{
pkg_desc_t *desc = obj;
if (desc->name != NULL) {
input_file_complain(f, "name redefined");
return -1;
}
desc->name = strdup(f->line);
if (desc->name == NULL) {
input_file_complain(f, "out of memory");
return -1;
}
return 0;
}
static int handle_toc_compressor(input_file_t *f, void *obj)
{
pkg_desc_t *desc = obj;
desc->toccmp = compressor_by_name(f->line);
if (desc->toccmp == NULL) {
input_file_complain(f, "unkown compressor");
return -1;
}
return 0;
}
static int handle_data_compressor(input_file_t *f, void *obj)
{
pkg_desc_t *desc = obj;
desc->datacmp = compressor_by_name(f->line);
if (desc->datacmp == NULL) {
input_file_complain(f, "unkown compressor");
return -1;
}
return 0;
}
static const keyword_handler_t line_hooks[] = {
{ "toc-compressor", handle_toc_compressor },
{ "data-compressor", handle_data_compressor },
{ "requires", handle_requires },
{ "name", handle_name },
};
#define NUM_LINE_HOOKS (sizeof(line_hooks) / sizeof(line_hooks[0]))
static compressor_t *get_default_compressor(void)
{
compressor_t *cmp;
cmp = compressor_by_id(PKG_COMPRESSION_LZMA);
if (cmp != NULL)
return cmp;
cmp = compressor_by_id(PKG_COMPRESSION_ZLIB);
if (cmp != NULL)
return cmp;
cmp = compressor_by_id(PKG_COMPRESSION_NONE);
if (cmp != NULL)
return cmp;
return cmp;
}
int desc_read(const char *path, pkg_desc_t *desc)
{
input_file_t f;
memset(desc, 0, sizeof(*desc));
if (open_file(&f, path))
return -1;
if (process_file(&f, line_hooks, NUM_LINE_HOOKS, desc)) {
cleanup_file(&f);
return -1;
}
cleanup_file(&f);
if (desc->datacmp == NULL)
desc->datacmp = get_default_compressor();
if (desc->toccmp == NULL)
desc->toccmp = get_default_compressor();
if (desc->datacmp == NULL || desc->toccmp == NULL) {
fputs("no compressor implementations available\n", stderr);
desc_free(desc);
return -1;
}
return 0;
}
void desc_free(pkg_desc_t *desc)
{
dependency_t *dep;
while (desc->deps != NULL) {
dep = desc->deps;
desc->deps = dep->next;
free(dep);
}
free(desc->name);
}