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 }