| 103 | } |
| 104 | |
| 105 | static cc_result ZipWriter_LocalFile(struct Stream* s, struct ResourceZipEntry* e) { |
| 106 | int filenameLen = String_Length(e->filename); |
| 107 | cc_uint8 header[30 + STRING_SIZE]; |
| 108 | cc_result res; |
| 109 | int modTime, modDate; |
| 110 | |
| 111 | GetCurrentZipDate(&modTime, &modDate); |
| 112 | if ((res = s->Position(s, &e->offset))) return res; |
| 113 | |
| 114 | Stream_SetU32_LE(header + 0, 0x04034b50); /* signature */ |
| 115 | Stream_SetU16_LE(header + 4, 20); /* version needed */ |
| 116 | Stream_SetU16_LE(header + 6, 0); /* bitflags */ |
| 117 | Stream_SetU16_LE(header + 8, 0); /* compression method */ |
| 118 | Stream_SetU16_LE(header + 10, modTime); /* last modified */ |
| 119 | Stream_SetU16_LE(header + 12, modDate); /* last modified */ |
| 120 | |
| 121 | Stream_SetU32_LE(header + 14, e->crc32); /* CRC32 */ |
| 122 | Stream_SetU32_LE(header + 18, e->size); /* Compressed size */ |
| 123 | Stream_SetU32_LE(header + 22, e->size); /* Uncompressed size */ |
| 124 | |
| 125 | Stream_SetU16_LE(header + 26, filenameLen); /* name length */ |
| 126 | Stream_SetU16_LE(header + 28, 0); /* extra field length */ |
| 127 | |
| 128 | Mem_Copy(header + 30, e->filename, filenameLen); |
| 129 | return Stream_Write(s, header, 30 + filenameLen); |
| 130 | } |
| 131 | |
| 132 | static cc_result ZipWriter_CentralDir(struct Stream* s, struct ResourceZipEntry* e) { |
| 133 | int filenameLen = String_Length(e->filename); |
no test coverage detected