files.c (1725B)
1 #include "writer/gemini/files.h" 2 3 #include <assert.h> 4 #include <err.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <sys/types.h> 8 9 #include "format.h" 10 #include "utils.h" 11 #include "writer/gemini/page.h" 12 13 struct GeminiFiles { 14 const GitRepo* repo; 15 const FileSystem* fs; 16 FILE* out; 17 GeminiPage* page; 18 }; 19 20 GeminiFiles* gemini_files_create(const GitRepo* repo, const FileSystem* fs) { 21 assert(repo != NULL); 22 assert(fs != NULL); 23 GeminiFiles* files = ecalloc(1, sizeof(GeminiFiles)); 24 files->repo = repo; 25 files->fs = fs; 26 files->out = fs->fopen("files.gmi", "w"); 27 if (!files->out) { 28 err(1, "fopen: files.gmi"); 29 } 30 files->page = gemini_page_create(files->out, repo, fs, "Files", ""); 31 return files; 32 } 33 34 void gemini_files_free(GeminiFiles* files) { 35 if (!files) { 36 return; 37 } 38 files->fs->fclose(files->out); 39 gemini_page_free(files->page); 40 free(files); 41 } 42 43 void gemini_files_begin(GeminiFiles* files) { 44 assert(files != NULL); 45 gemini_page_begin(files->page); 46 } 47 48 void gemini_files_add_file(GeminiFiles* files, const GitFile* file) { 49 assert(files != NULL); 50 assert(file != NULL); 51 FILE* out = files->out; 52 fprintf(out, "=> file/"); 53 print_percent_encoded(out, file->repo_path); 54 fprintf(out, ".gmi %s %s", file->mode, file->display_path); 55 56 ssize_t size_lines = file->size_lines; 57 ssize_t size_bytes = file->size_bytes; 58 if (size_lines >= 0) { 59 fprintf(out, " (%zdL)", size_lines); 60 } else if (size_bytes >= 0) { 61 fprintf(out, " (%zdB)", size_bytes); 62 } 63 const char* oid = file->commit_oid; 64 if (oid[0] != '\0') { 65 fprintf(out, " @ %s", oid); 66 } 67 fprintf(out, "\n"); 68 } 69 70 void gemini_files_end(GeminiFiles* files) { 71 assert(files != NULL); 72 gemini_page_end(files->page); 73 }