X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=blobdiff_plain;f=src%2Fsuffix.c;h=cf4d954ad1839bd5eac6ef056fc6e4a32a96b27d;hp=23868c914f8577edb9081c99bcc3275753f1e87b;hb=45ccda119355a1087450039a250359c1d0de0d08;hpb=bffe1074aab0bd180b6b522f07f951f73ef59191 diff --git a/src/suffix.c b/src/suffix.c index 23868c9..cf4d954 100644 --- a/src/suffix.c +++ b/src/suffix.c @@ -1,5 +1,5 @@ /* This file is part of GNU tar. - Copyright (C) 2007, 2009 Free Software Foundation, Inc. + Copyright 2007, 2009, 2013-2014 Free Software Foundation, Inc. Written by Sergey Poznyakoff. @@ -27,8 +27,9 @@ struct compression_suffix }; static struct compression_suffix compression_suffixes[] = { -#define __CAT2__(a,b) a ## b +#define __CAT2__(a,b) a ## b #define S(s,p) #s, sizeof (#s) - 1, __CAT2__(p,_PROGRAM) + { "tar", 3, NULL }, { S(gz, GZIP) }, { S(tgz, GZIP) }, { S(taz, GZIP) }, @@ -43,41 +44,71 @@ static struct compression_suffix compression_suffixes[] = { { S(tlz, LZMA) }, { S(lzo, LZOP) }, { S(xz, XZ) }, + { S(txz, XZ) }, /* Slackware */ + { NULL } #undef S #undef __CAT2__ }; -static int nsuffixes = sizeof (compression_suffixes) / - sizeof (compression_suffixes[0]); - -static const char * -find_compression_program (const char *name, const char *defprog) +static struct compression_suffix const * +find_compression_suffix (const char *name, size_t *base_len) { char *suf = strrchr (name, '.'); - + if (suf) { - int i; size_t len; - + struct compression_suffix *p; + suf++; len = strlen (suf); - for (i = 0; i < nsuffixes; i++) + for (p = compression_suffixes; p->suffix; p++) { - if (compression_suffixes[i].length == len - && memcmp (compression_suffixes[i].suffix, suf, len) == 0) - return compression_suffixes[i].program; + if (p->length == len && memcmp (p->suffix, suf, len) == 0) + { + if (*base_len) + *base_len = strlen (name) - len - 1; + return p; + } } } + return NULL; +} + +static const char * +find_compression_program (const char *name, const char *defprog) +{ + struct compression_suffix const *p = find_compression_suffix (name, NULL); + if (p) + return p->program; return defprog; } void -set_comression_program_by_suffix (const char *name, const char *defprog) +set_compression_program_by_suffix (const char *name, const char *defprog) { const char *program = find_compression_program (name, defprog); if (program) use_compress_program_option = program; } +char * +strip_compression_suffix (const char *name) +{ + char *s = NULL; + size_t len; + + if (find_compression_suffix (name, &len)) + { + if (strncmp (name + len - 4, ".tar", 4) == 0) + len -= 4; + if (len == 0) + return NULL; + s = xmalloc (len + 1); + memcpy (s, name, len); + s[len] = 0; + } + return s; +} +