File indexing completed on 2025-02-02 04:25:58

0001 /* Copyright 2015 the unarr project authors (see AUTHORS file).
0002    License: LGPLv3 */
0003 
0004 #include "unarr-imp.h"
0005 
0006 ar_archive *ar_open_archive(ar_stream *stream, size_t struct_size, ar_archive_close_fn close, ar_parse_entry_fn parse_entry,
0007                             ar_entry_get_name_fn get_name, ar_entry_uncompress_fn uncompress, ar_get_global_comment_fn get_comment,
0008                             off64_t first_entry_offset)
0009 {
0010     ar_archive *ar = malloc(struct_size);
0011     if (!ar)
0012         return NULL;
0013     memset(ar, 0, struct_size);
0014     ar->close = close;
0015     ar->parse_entry = parse_entry;
0016     ar->get_name = get_name;
0017     ar->uncompress = uncompress;
0018     ar->get_comment = get_comment;
0019     ar->stream = stream;
0020     ar->entry_offset_first = first_entry_offset;
0021     ar->entry_offset_next = first_entry_offset;
0022     return ar;
0023 }
0024 
0025 void ar_close_archive(ar_archive *ar)
0026 {
0027     if (ar)
0028         ar->close(ar);
0029     free(ar);
0030 }
0031 
0032 bool ar_at_eof(ar_archive *ar)
0033 {
0034     return ar->at_eof;
0035 }
0036 
0037 bool ar_parse_entry(ar_archive *ar)
0038 {
0039     return ar->parse_entry(ar, ar->entry_offset_next);
0040 }
0041 
0042 bool ar_parse_entry_at(ar_archive *ar, off64_t offset)
0043 {
0044     ar->at_eof = false;
0045     return ar->parse_entry(ar, offset ? offset : ar->entry_offset_first);
0046 }
0047 
0048 bool ar_parse_entry_for(ar_archive *ar, const char *entry_name)
0049 {
0050     ar->at_eof = false;
0051     if (!entry_name)
0052         return false;
0053     if (!ar_parse_entry_at(ar, ar->entry_offset_first))
0054         return false;
0055     do {
0056         const char *name = ar_entry_get_name(ar);
0057         if (name && strcmp(name, entry_name) == 0)
0058             return true;
0059     } while (ar_parse_entry(ar));
0060     return false;
0061 }
0062 
0063 const char *ar_entry_get_name(ar_archive *ar)
0064 {
0065     return ar->get_name(ar);
0066 }
0067 
0068 off64_t ar_entry_get_offset(ar_archive *ar)
0069 {
0070     return ar->entry_offset;
0071 }
0072 
0073 size_t ar_entry_get_size(ar_archive *ar)
0074 {
0075     return ar->entry_size_uncompressed;
0076 }
0077 
0078 time64_t ar_entry_get_filetime(ar_archive *ar)
0079 {
0080     return ar->entry_filetime;
0081 }
0082 
0083 bool ar_entry_uncompress(ar_archive *ar, void *buffer, size_t count)
0084 {
0085     return ar->uncompress(ar, buffer, count);
0086 }
0087 
0088 size_t ar_get_global_comment(ar_archive *ar, void *buffer, size_t count)
0089 {
0090     if (!ar->get_comment)
0091         return 0;
0092     return ar->get_comment(ar, buffer, count);
0093 }
0094 
0095 void ar_log(const char *prefix, const char *file, int line, const char *msg, ...)
0096 {
0097     va_list args;
0098     va_start(args, msg);
0099     if (prefix)
0100         fprintf(stderr, "%s ", prefix);
0101     if (strrchr(file, '/'))
0102         file = strrchr(file, '/') + 1;
0103     if (strrchr(file, '\\'))
0104         file = strrchr(file, '\\') + 1;
0105     fprintf(stderr, "%s:%d: ", file, line);
0106     vfprintf(stderr, msg, args);
0107     fprintf(stderr, "\n");
0108     va_end(args);
0109 }