-static int decfile_parse_header(struct rnet_decfile *decfile)
-{
- char *buffer;
- int r;
- char *p;
-
- p = buffer = get_header(decfile);
- if (!buffer)
- return -EINVAL;
-
- r = parse_header_common(decfile->header, &p);
- if (r)
- return r;
-
- switch (strlen(buffer)) {
- case RNET_HEADER_SIZE_2013:
- return parse_header_2013(decfile->header, p);
- case RNET_HEADER_SIZE_2014:
- return parse_header_2014(decfile->header, p);
- case RNET_HEADER_SIZE_2015:
- return parse_header_2015(decfile->header, p);
- default:
- fprintf(stderr, "Unknown file version, but proceeding anyway.\n");
- }
- return 0;
-}
-
-static int decfile_parse(struct rnet_decfile *decfile)
-{
- char *buffer = NULL;
- size_t len = 0;
- int r;
- while ((r = getline(&buffer, &len, decfile->file)) > 0) {
- r = append_line(decfile, buffer);
- if (r) {
- free(buffer);
- goto out;
- }
- buffer = NULL;
- len = 0;
- }
- if (!(r = decfile_parse_header(decfile)) && !(r = decfile_parse_file(decfile)))
- return 0;
-out:
- decfile_release_lines(decfile);
- return r;
-}
-
-struct rnet_decfile * rnet_decfile_open(char *filename)
-{
- struct rnet_decfile *decfile;
- int r = -ENOMEM;
- decfile = malloc(sizeof(*decfile));
- if (!decfile)
- return NULL;
- decfile->header = pmhash_new();
- if (!decfile->header)
- goto out_header;
- decfile->message = rnet_message_new();
- if (!decfile->message)
- goto out_message;
- decfile->filename = strdup(filename);
- if (!decfile->filename)
- goto out_filename;
- decfile->file = fopen(filename, "r");
- if (!decfile->file)
- goto out_file;
- decfile->lines_len = 0;
- decfile->lines = NULL;
- if ((r = decfile_parse(decfile)))
- goto out_parse;
- return decfile;
-out_parse:
- fclose(decfile->file);
-out_file:
- free(decfile->filename);
-out_filename:
- rnet_message_del(decfile->message);
-out_message:
- pmhash_del(decfile->header);
-out_header:
- free(decfile);
- errno = -r;
- return NULL;
-}
-
-void rnet_decfile_close(struct rnet_decfile *decfile)
-{
- decfile_release_lines(decfile);
- fclose(decfile->file);
- free(decfile->filename);
- free(decfile);
-}
-
-static char * get_header(struct rnet_decfile *decfile)
-{
- int i;
- for (i = 0; i < decfile->lines_len; i++) {
- if (!strncmp(decfile->lines[i], "IRPF", 4)) {
- return decfile->lines[i];
- }
- }
- return NULL;
-}
-