string escaping

This commit is contained in:
nova
2026-05-01 22:17:33 +02:00
parent 6372dbba69
commit 1711926003
6 changed files with 85 additions and 61 deletions

View File

@@ -13,26 +13,19 @@ extern unsigned int terminal_height;
extern unsigned int terminal_width;
char previewd;
char* text(char *path, unsigned long *file_size);
char* text(file *f);
void images_print(char *file_name);
void images_clear();
char* generic(char *path);
char* generic(file *f);
char* get_mimetype(char *path){
static char *cmd_str = "file --mime-type -b ./\"";
unsigned long cmd_len = strlen(cmd_str);
unsigned int path_len = strlen(path);
char *cmd = malloc((cmd_len + path_len) + 2);
memset(cmd, ' ', cmd_len + path_len);
memcpy(cmd, cmd_str, cmd_len);
memcpy(cmd + cmd_len, path, path_len);
cmd[cmd_len + path_len] = '\"';
cmd[cmd_len + path_len + 1] = '\0';
char* get_mimetype(file *f){
static const char *cmd_str = "file --mime-type -b";
char *cmd = parse_cmd(cmd_str, f);
FILE *cmd_open = popen(cmd, "r");
char *line = NULL;
size_t size = 0;
free(cmd);
if (getline(&line, &size, cmd_open) != -1){
pclose(cmd_open);
@@ -42,57 +35,60 @@ char* get_mimetype(char *path){
return "unknown";
}
}
char* preview_file(char *file_name, unsigned long file_size){
char* preview_file(file *f){
/* this calls "file" on path */
char *file_buffer;
char *mime = get_mimetype(file_name);
char *mime = get_mimetype(f);
#if SETTINGS_UEBERZUG_IMAGE_PREVIEW != 0
images_clear();
#endif
if (strstr(mime, "text")) {
file_buffer = text(file_name, &file_size);
file_buffer = text(f);
#if SETTINGS_UEBERZUG_IMAGE_PREVIEW != 0
} else if (strstr(mime, "image")) {
file_buffer = generic(file_name);
images_print(file_name);
file_buffer = generic(f);
images_print(f->file_name);
previewd = 1;
#endif
} else {
file_buffer = generic(file_name);
file_buffer = generic(f);
}
free(mime);
return file_buffer;
}
char* text(char *path, unsigned long *file_size){
char* text(file *f){
unsigned long size = (terminal_width/2) * terminal_height;
if (size > *file_size) {
size = *file_size;
if (size > f->file_size) {
size = f->file_size;
}
char *file_buffer = malloc(size + 1);
FILE *fp = fopen(path, "r");
FILE *fp = fopen(f->file_name, "r");
if (fread(file_buffer, size, 1, fp) != 0) {
fclose(fp);
file_buffer[size] = '\0';
return file_buffer;
} else {
fclose(fp);
return "failed reading file";
}
}
char* generic(char *path){
char *cmd;
concat(cmd, "file ./\"", path, 0);
concat(cmd, cmd, "\"", 1);
char* generic(file *f){
static const char *cmd_str = "file ";
char *cmd = parse_cmd(cmd_str, f);
FILE *cmd_open = popen(cmd, "r");
char *line = NULL;
size_t size = 0;
free(cmd);
if (getline(&line, &size, cmd_open) != -1) {
pclose(cmd_open);
return line;