Overview
Comment: | objfw-unzip -> ofzip
This way, one tool can be used for all ZIP operations, even though it |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
ab0be1f3f99cd91243b8e87060bc7fa3 |
User & Date: | js on 2013-11-10 00:35:05 |
Other Links: | manifest | tags |
Context
2013-11-18
| ||
14:09 | OFZIP: Allow extracting single files. check-in: 2bd117c218 user: js tags: trunk | |
2013-11-10
| ||
00:35 | objfw-unzip -> ofzip check-in: ab0be1f3f9 user: js tags: trunk | |
2013-11-09
| ||
19:22 | Add OFOptionsParser. check-in: 4521cb6dbc user: js tags: trunk | |
Changes
Modified .gitignore from [130da53fc2] to [f85629722b].
︙ | ︙ | |||
32 33 34 35 36 37 38 | src/ObjFW tests/tests tests/tests.exe tests/EBOOT.PBP tests/PARAM.SFO tests/objc_sync/objc_sync utils/objfw-config | | | 32 33 34 35 36 37 38 39 | src/ObjFW tests/tests tests/tests.exe tests/EBOOT.PBP tests/PARAM.SFO tests/objc_sync/objc_sync utils/objfw-config utils/ofzip |
Modified utils/Makefile from [08fc38cf47] to [15b79bef1e].
|
| | | | 1 2 3 4 5 6 7 8 9 | PROG = ofzip SRCS = OFZIP.m include ../buildsys.mk DISTCLEAN = objfw-config install-extra: objfw-config objfw-compile for i in objfw-config objfw-compile; do \ |
︙ | ︙ |
Added utils/OFZIP.m version [651abb43b6].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | #import "OFApplication.h" #import "OFArray.h" #import "OFDictionary.h" #import "OFFile.h" #import "OFOptionsParser.h" #import "OFStdIOStream.h" #import "OFZIPArchive.h" #import "OFZIPArchiveEntry.h" #import "autorelease.h" #import "macros.h" #define BUFFER_SIZE 4096 @interface OFZIP: OFObject - (void)extractAllFilesFromArchive: (OFZIPArchive*)archive; @end OF_APPLICATION_DELEGATE(OFZIP) static void help(OFStream *stream, int status) { [stream writeFormat: @"Usage: %@ -x archive1.zip [archive2.zip ...]\n", [OFApplication programName]]; [OFApplication terminateWithStatus: status]; } @implementation OFZIP - (void)applicationDidFinishLaunching { OFOptionsParser *optionsParser = [OFOptionsParser parserWithOptions: @"xh"]; enum { NONE, EXTRACT } mode; OFEnumerator *enumerator; OFString *file; of_unichar_t option; while ((option = [optionsParser nextOption]) != '\0') { switch (option) { case 'x': mode = EXTRACT; break; case 'h': help(of_stdout, 0); break; case '?': [of_stderr writeFormat: @"%@: Unknown option: -%c\n", [OFApplication programName], [optionsParser lastOption]]; [OFApplication terminateWithStatus: 1]; break; } } switch (mode) { case EXTRACT: enumerator = [[optionsParser remainingArguments] objectEnumerator]; while ((file = [enumerator nextObject]) != nil) { void *pool = objc_autoreleasePoolPush(); [self extractAllFilesFromArchive: [OFZIPArchive archiveWithPath: file]]; objc_autoreleasePoolPop(pool); } break; default: help(of_stderr, 1); break; } [OFApplication terminate]; } - (void)extractAllFilesFromArchive: (OFZIPArchive*)archive { OFEnumerator *enumerator = [[archive entries] objectEnumerator]; OFZIPArchiveEntry *entry; int_fast8_t override = 0; while ((entry = [enumerator nextObject]) != nil) { void *pool = objc_autoreleasePoolPush(); OFString *fileName = [entry fileName]; OFString *outFileName = [fileName stringByStandardizingPath]; OFEnumerator *componentEnumerator; OFString *component, *directory; OFStream *stream; OFFile *output; char buffer[BUFFER_SIZE]; off_t written = 0, size = [entry uncompressedSize]; int_fast8_t percent = -1, newPercent; #ifndef _WIN32 if ([outFileName hasPrefix: @"/"]) { #else if ([outFileName hasPrefix: @"/"] || [outFileName containsString: @":"]) { #endif [of_stdout writeFormat: @"Refusing to extract %@!\n", fileName]; [OFApplication terminateWithStatus: 1]; } componentEnumerator = [[outFileName pathComponents] objectEnumerator]; while ((component = [componentEnumerator nextObject]) != nil) { if ([component isEqual: OF_PATH_PARENT_DIRECTORY]) { [of_stdout writeFormat: @"Refusing to extract %@!\n", fileName]; [OFApplication terminateWithStatus: 1]; } } [of_stdout writeFormat: @"Extracting %@...", fileName]; if ([fileName hasSuffix: @"/"]) { [OFFile createDirectoryAtPath: outFileName createParents: true]; [of_stdout writeLine: @" done"]; continue; } directory = [outFileName stringByDeletingLastPathComponent]; if (![OFFile directoryExistsAtPath: directory]) [OFFile createDirectoryAtPath: directory createParents: true]; if ([OFFile fileExistsAtPath: outFileName] && override != 1) { OFString *line; if (override == -1) { [of_stdout writeLine: @" skipped"]; continue; } do { [of_stderr writeFormat: @"\rOverride %@? [ynAN] ", fileName]; line = [of_stdin readLine]; } while (![line isEqual: @"y"] && ![line isEqual: @"n"] && ![line isEqual: @"N"] && ![line isEqual: @"A"]); if ([line isEqual: @"A"]) override = 1; else if ([line isEqual: @"N"]) override = -1; if ([line isEqual: @"n"] || [line isEqual: @"N"]) { [of_stdout writeFormat: @"Skipping %@...\n", fileName]; continue; } [of_stdout writeFormat: @"Extracting %@...", fileName]; } stream = [archive streamForReadingFile: fileName]; output = [OFFile fileWithPath: outFileName mode: @"w"]; while (![stream isAtEndOfStream]) { size_t length = [stream readIntoBuffer: buffer length: BUFFER_SIZE]; [output writeBuffer: buffer length: length]; written += length; newPercent = (written == size ? 100 : (int_fast8_t)(written * 100 / size)); if (percent != newPercent) { percent = newPercent; [of_stdout writeFormat: @"\rExtracting %@... %3u%%", fileName, percent]; } } [of_stdout writeFormat: @"\rExtracting %@... done\n", fileName]; objc_autoreleasePoolPop(pool); } } @end |
Deleted utils/objfw-unzip.m version [df6343564c].
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |