files.c (1768B)
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 files->out = NULL; 40 gemini_page_free(files->page); 41 files->page = NULL; 42 free(files); 43 } 44 45 void gemini_files_begin(GeminiFiles* files) { 46 assert(files != NULL); 47 gemini_page_begin(files->page); 48 } 49 50 void gemini_files_add_file(GeminiFiles* files, const GitFile* file) { 51 assert(files != NULL); 52 assert(file != NULL); 53 FILE* out = files->out; 54 fprintf(out, "=> file/"); 55 print_percent_encoded(out, file->repo_path); 56 fprintf(out, ".gmi %s %s", file->mode, file->display_path); 57 58 ssize_t size_lines = file->size_lines; 59 ssize_t size_bytes = file->size_bytes; 60 if (size_lines >= 0) { 61 fprintf(out, " (%zdL)", size_lines); 62 } else if (size_bytes >= 0) { 63 fprintf(out, " (%zdB)", size_bytes); 64 } 65 const char* oid = file->commit_oid; 66 if (oid[0] != '\0') { 67 fprintf(out, " @ %s", oid); 68 } 69 fprintf(out, "\n"); 70 } 71 72 void gemini_files_end(GeminiFiles* files) { 73 assert(files != NULL); 74 gemini_page_end(files->page); 75 }