#include "cppc4group.hpp" #include const char* formatTime(int32_t time) { time_t tTime = time; static char ret[128]; strftime(ret, sizeof(ret), "%c", localtime(&tTime)); return ret; } const char* formatSize(uint32_t size) { static char ret[128]; if(size < 1000) { snprintf(ret, 128, "%4u", size); return ret; } static const char prefixes[] = " KMGTPE"; const char* prefix = prefixes; uint32_t fract = 0; while(size >= 1000 && *(prefix + 1) != '\0') { ++prefix; fract = size % 1000; size /= 1000; } if(size < 10) { snprintf(ret, 128, "%1.1f%c", (float)size + (float)fract / 1000, *prefix); } else { snprintf(ret, 128, "%3u%c", size, *prefix); } return ret; } int main(int argc, char* argv[]) { if(argc != 3) { std::cerr << "USAGE: " << argv[0] << " \n"; return EXIT_FAILURE; } CppC4Group g; if(!g.openExisting(argv[1])) { std::cerr << "ERROR: Can't open group: " << g.getErrorMessage() << '\n'; return EXIT_FAILURE; } if(auto child = g.openAsChild(argv[2])) { if(auto entries = child->getEntryInfos()) { for(const auto& entry : *entries) { std::cout << (entry.directory ? 'd' : entry.executable ? 'x' : ' ') << " " << formatTime(entry.modified) << ' ' << formatSize(entry.totalSize) << " " << entry.fileName << '\t' << entry.author << '\n'; } } else { std::cerr << "ERROR: Can't list subgroup contents: " << child->getErrorMessage(); } } else { std::cerr << "ERROR: Can't open subgroup: " << g.getErrorMessage(); return EXIT_FAILURE; } }