// Written by retoor@molodetz.nl // This header file contains utility functions for manipulating file system paths, focusing primarily on expanding paths starting with '~' to the home directory. // This code uses standard libraries: stdio.h, stdlib.h, and string.h, and conditionally includes the posix libraries pwd.h and unistd.h when expanding the home directory manually. // MIT License // // Permission is granted to use, copy, modify, merge, distribute, sublicense, and/or sell copies of the Software. // The license includes conditions about providing a copy of the license and the limitation of liability and warranty. #ifndef UTILS_H #define UTILS_H #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> char* expand_home_directory(const char* path) { if (path == NULL) return NULL; if (path[0] == '~' && path[1] == '/') { const char* home_dir = getenv("HOME"); if (home_dir == NULL) { #include <pwd.h> #include <unistd.h> struct passwd* pw = getpwuid(getuid()); if (pw == NULL) return NULL; home_dir = pw->pw_dir; } size_t home_len = strlen(home_dir); size_t path_len = strlen(path) - 1; char* expanded_path = malloc(home_len + path_len + 1); if (expanded_path == NULL) return NULL; strcpy(expanded_path, home_dir); strcat(expanded_path, path + 1); return expanded_path; } else { return strdup(path); } } char * read_file(const char * path) { char * expanded_path = expand_home_directory(path); FILE *file = fopen(expanded_path, "r"); free(expanded_path); if (file == NULL) { return NULL; } fseek(file, 0, SEEK_END); long size = ftell(file); fseek(file, 0, SEEK_SET); char *buffer = (char *)malloc(size + 1); size_t read = fread(buffer, 1, size, file); if (read == 0) { free(buffer); return NULL; } fclose(file); buffer[read] = '\0'; return buffer; } #endif