mirror of
https://github.com/vasi/pixz
synced 2024-11-18 15:26:46 +00:00
Actually match like tar does
This commit is contained in:
parent
7aed15667b
commit
62e24fb4c1
29
pread.c
29
pread.c
@ -24,7 +24,8 @@ static FILE *gOutFile;
|
|||||||
static lzma_vli gFileIndexOffset = 0;
|
static lzma_vli gFileIndexOffset = 0;
|
||||||
static size_t gBlockInSize = 0, gBlockOutSize = 0;
|
static size_t gBlockInSize = 0, gBlockOutSize = 0;
|
||||||
|
|
||||||
static void set_block_sizes();
|
static void set_block_sizes(void);
|
||||||
|
static void setup_specs(void);
|
||||||
static bool want_file(const char *name);
|
static bool want_file(const char *name);
|
||||||
|
|
||||||
|
|
||||||
@ -48,8 +49,9 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
gFileSpecs = argv + optind;
|
gFileSpecs = argv + optind;
|
||||||
gFileSpecEnd = gFileSpecs + argc - optind;
|
gFileSpecEnd = gFileSpecs + argc - optind;
|
||||||
|
setup_specs();
|
||||||
|
|
||||||
// Setup file index
|
// Set up file index
|
||||||
gFileIndexOffset = read_file_index();
|
gFileIndexOffset = read_file_index();
|
||||||
set_block_sizes();
|
set_block_sizes();
|
||||||
for (file_index_t *fi = gFileIndex; fi; fi = fi->next) {
|
for (file_index_t *fi = gFileIndex; fi; fi = fi->next) {
|
||||||
@ -134,16 +136,29 @@ static void read_thread(void) {
|
|||||||
pipeline_stop();
|
pipeline_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool want_file(const char *name) {
|
static void setup_specs(void) {
|
||||||
for (char **spec = gFileSpecs; spec < gFileSpecEnd; ++spec) {
|
for (char **spec = gFileSpecs; spec < gFileSpecEnd; ++spec) {
|
||||||
bool found = true;
|
// Remove trailing slashes
|
||||||
for (const char *a = *spec, *b = name; *a; ++a, ++b) {
|
char *c = *spec;
|
||||||
|
while (*c++) ;
|
||||||
|
while (--c >= *spec) {
|
||||||
|
if (*c == '/')
|
||||||
|
*c = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool want_file(const char *name) {
|
||||||
|
const char *a, *b;
|
||||||
|
for (char **spec = gFileSpecs; spec < gFileSpecEnd; ++spec) {
|
||||||
|
bool diff = false;
|
||||||
|
for (a = *spec, b = name; *a; ++a, ++b) {
|
||||||
if (!*b || *a != *b) {
|
if (!*b || *a != *b) {
|
||||||
found = false;
|
diff = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found)
|
if (!diff && (!*b || *b == '/'))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user