|
33 | 33 |
|
34 | 34 | static int ExtractFile (pack_t *pak, const char *filename, const char *destdir) |
35 | 35 | { |
36 | | - char dest[1024], *dptr; |
37 | | - int i; |
| 36 | + char dest[MAX_OSPATH], *dptr; |
| 37 | + size_t filenamelen = 0; |
| 38 | + int fileisdir = 0, i; |
38 | 39 |
|
39 | | - if (!destdir || !*destdir) |
| 40 | + if (filename) |
40 | 41 | { |
41 | | - dptr = dest; |
| 42 | + filenamelen = strlen(filename); |
| 43 | + if (filenamelen) |
| 44 | + fileisdir = filename[filenamelen - 1] == '/'; |
42 | 45 | } |
| 46 | + |
| 47 | + if (!destdir || !*destdir) |
| 48 | + dptr = dest; |
| 49 | + |
43 | 50 | else |
44 | 51 | { |
45 | 52 | strcpy (dest, destdir); |
46 | | - i = strlen (destdir); |
47 | | - if (!IS_DIR_SEPARATOR(dest[i - 1])) |
48 | | - { |
49 | | - dest[i] = DIR_SEPARATOR_CHAR; |
50 | | - dest[i + 1] = '\0'; |
51 | | - } |
52 | 53 | dptr = strchr(dest, '\0'); |
| 54 | + if (!IS_DIR_SEPARATOR(*(dptr - 1))) |
| 55 | + *dptr++ = DIR_SEPARATOR_CHAR; |
53 | 56 | } |
54 | 57 |
|
| 58 | + *dptr = '\0'; |
| 59 | + |
55 | 60 | for (i = 0; i < pak->numfiles; i++) |
56 | 61 | { |
57 | | - if (!filename) |
| 62 | + if (!filename || (!strncmp (pak->files[i].name, filename, filenamelen) && |
| 63 | + (fileisdir || pak->files[i].name[filenamelen] == '\0'))) |
58 | 64 | { |
59 | 65 | fseek (pak->handle, pak->files[i].filepos, SEEK_SET); |
60 | 66 | strcpy (dptr, pak->files[i].name); |
61 | 67 | dest[sizeof(dest) - 1] = '\0'; |
62 | 68 | printf ("%s --> %s\n", pak->files[i].name, dest); |
63 | 69 | if (Q_WriteFileFromHandle(pak->handle, dest, pak->files[i].filelen) != 0) |
64 | 70 | COM_Error ("I/O errors during copy."); |
65 | | - continue; |
66 | | - } |
67 | | - if (!strcmp (pak->files[i].name, filename)) |
68 | | - { |
69 | | - fseek (pak->handle, pak->files[i].filepos, SEEK_SET); |
70 | | - strcpy (dptr, pak->files[i].name); |
71 | | - dest[sizeof(dest) - 1] = '\0'; |
72 | | - printf ("%s --> %s\n", pak->files[i].name, dest); |
73 | | - if (Q_WriteFileFromHandle(pak->handle, dest, pak->files[i].filelen) != 0) |
74 | | - COM_Error ("I/O errors during copy."); |
75 | | - break; |
| 71 | + |
| 72 | + if (filename && !fileisdir) |
| 73 | + break; |
76 | 74 | } |
77 | 75 | } |
78 | | - if (filename != NULL && i == pak->numfiles) |
| 76 | + if (filename && *dptr == '\0') |
79 | 77 | { |
80 | 78 | fprintf (stderr, "** %s not in %s\n", filename, pak->filename); |
81 | 79 | return 1; |
|
0 commit comments