Unverified Commit 697fee92 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Use dynamic memory for feh_printf output; grow it as needed

I.e., no longer hardcode its output length to 4096 characters.

Closes #812
parent 16cae1d2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1279,6 +1279,7 @@ void feh_draw_info(winwidget w)
	info_cmd = feh_printf(opt.info_cmd, FEH_FILE(w->file->data), w);

	info_pipe = popen(info_cmd, "r");
	free(info_cmd);

	if (!info_pipe) {
		info_buf[0] = estrdup("Failed to run info command");
+6 −2
Original line number Diff line number Diff line
@@ -271,8 +271,10 @@ void init_index_mode(void)

			lineno = 0;
			if (opt.index_info) {
				line = lines = feh_wrap_string(create_index_string(file),
				char *tmp = create_index_string(file);
				line = lines = feh_wrap_string(tmp,
						opt.thumb_w * 3, fn, NULL);
				free(tmp);

				while (line) {
					gib_imlib_get_text_size(fn, (char *) line->data,
@@ -447,7 +449,9 @@ void get_index_string_dim(feh_file *file, Imlib_Font fn, int *fw, int *fh)
		file->info = feh_file_info_new();
	}

	line = lines = feh_wrap_string(create_index_string(file), opt.thumb_w * 3, fn, NULL);
	char *tmp = create_index_string(file);
	line = lines = feh_wrap_string(tmp, opt.thumb_w * 3, fn, NULL);
	free(tmp);

	while (line) {
		gib_imlib_get_text_size(fn, (char *) line->data,
+5 −3
Original line number Diff line number Diff line
@@ -42,9 +42,11 @@ void init_list_mode(void)

	for (l = filelist; l; l = l->next) {
		file = FEH_FILE(l->data);
		if (opt.customlist)
			printf("%s\n", feh_printf(opt.customlist, file, NULL));
		else {
		if (opt.customlist) {
			char *tmp = feh_printf(opt.customlist, file, NULL);
			puts(tmp);
			free(tmp);
		} else {
			printf("%d\t%s\t%d\t%d\t%s", ++j,
					file->info->format, file->info->width,
					file->info->height,
+63 −39
Original line number Diff line number Diff line
@@ -379,14 +379,15 @@ void slideshow_pause_toggle(winwidget w)
void feh_action_run(feh_file * file, char *action, winwidget winwid)
{
	if (action) {
		char *sys;
		D(("Running action %s\n", action));
		sys = feh_printf(action, file, winwid);
		char *sys = feh_printf(action, file, winwid);

		if (opt.verbose && !opt.list && !opt.customlist)
			fprintf(stderr, "Running action -->%s<--\n", sys);
		if (system(sys) == -1)
			perror("running action via system() failed");

		free(sys);
	}
	return;
}
@@ -408,157 +409,178 @@ char *feh_printf(char *str, feh_file * file, winwidget winwid)
{
	char *c;
	char buf[20];
	static char ret[4096];
	char *filelist_tmppath;

	unsigned int ret_used = 0;
	unsigned int ret_size = 4096;
	char *ret = emalloc(ret_size);

	ret[0] = '\0';
	filelist_tmppath = NULL;
	gib_list *f;

	for (c = str; *c != '\0'; c++) {
		ret_used = strlen(ret) + 1;
		if (ret_size - ret_used < 20) {
			ret_size += 4096;
			ret = erealloc(ret, ret_size);
		}
		if ((*c == '%') && (*(c+1) != '\0')) {
			c++;
			switch (*c) {
			case 'a':
				if (opt.paused == 1) {
				   strncat(ret, "paused", sizeof(ret) - strlen(ret) - 1);
				   strncat(ret, "paused", ret_size - ret_used);
				}
				else {
				   strncat(ret, "playing", sizeof(ret) - strlen(ret) - 1);
				   strncat(ret, "playing", ret_size - ret_used);
				}
				break;
			case 'f':
				if (file)
					strncat(ret, file->filename, sizeof(ret) - strlen(ret) - 1);
				if (file) {
					if (strlen(file->filename) > ret_size - ret_used) {
						ret_size += 4096;
						ret = erealloc(ret, ret_size);
					}
					strncat(ret, file->filename, ret_size - ret_used);
				}
				break;
			case 'F':
				if (file)
					strncat(ret, shell_escape(file->filename), sizeof(ret) - strlen(ret) - 1);
				if (file) {
					if (strlen(shell_escape(file->filename)) > ret_size - ret_used) {
						ret_size += 4096;
						ret = erealloc(ret, ret_size);
					}
					strncat(ret, shell_escape(file->filename), ret_size - ret_used);
				}
				break;
			case 'g':
				if (winwid) {
					snprintf(buf, sizeof(buf), "%d,%d", winwid->w, winwid->h);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				}
				break;
			case 'h':
				if (file && (file->info || !feh_file_info_load(file, NULL))) {
					snprintf(buf, sizeof(buf), "%d", file->info->height);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				}
				break;
			case 'l':
				snprintf(buf, sizeof(buf), "%d", gib_list_length(filelist));
				strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
				strncat(ret, buf, ret_size - ret_used);
				break;
			case 'L':
				if (filelist_tmppath != NULL) {
					strncat(ret, filelist_tmppath, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, filelist_tmppath, ret_size - ret_used);
				} else {
					filelist_tmppath = feh_unique_filename("/tmp/","filelist");
					feh_write_filelist(filelist, filelist_tmppath);
					strncat(ret, filelist_tmppath, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, filelist_tmppath, ret_size - ret_used);
				}
				break;
			case 'm':
				strncat(ret, mode, sizeof(ret) - strlen(ret) - 1);
				strncat(ret, mode, ret_size - ret_used);
				break;
			case 'n':
				if (file)
					strncat(ret, file->name, sizeof(ret) - strlen(ret) - 1);
				if (file) {
					strncat(ret, file->name, ret_size - ret_used);
				}
				break;
			case 'N':
				if (file)
					strncat(ret, shell_escape(file->name), sizeof(ret) - strlen(ret) - 1);
				if (file) {
					strncat(ret, shell_escape(file->name), ret_size - ret_used);
				}
				break;
			case 'o':
				if (winwid) {
					snprintf(buf, sizeof(buf), "%d,%d", winwid->im_x,
						winwid->im_y);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				}
				break;
			case 'p':
				if (file && (file->info || !feh_file_info_load(file, NULL))) {
					snprintf(buf, sizeof(buf), "%d", file->info->pixels);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				}
				break;
			case 'P':
				if (file && (file->info || !feh_file_info_load(file, NULL))) {
					strncat(ret, format_size(file->info->pixels), sizeof(ret) - strlen(ret) - 1);
					strncat(ret, format_size(file->info->pixels), ret_size - ret_used);
				}
				break;
			case 'r':
				if (winwid) {
					snprintf(buf, sizeof(buf), "%.1f", winwid->im_angle);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				}
				break;
			case 's':
				if (file && (file->size >= 0 || !feh_file_stat(file))) {
					snprintf(buf, sizeof(buf), "%d", file->size);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				}
				break;
			case 'S':
				if (file && (file->size >= 0 || !feh_file_stat(file))) {
					strncat(ret, format_size(file->size), sizeof(ret) - strlen(ret) - 1);
					strncat(ret, format_size(file->size), ret_size - ret_used);
				}
				break;
			case 't':
				if (file && (file->info || !feh_file_info_load(file, NULL))) {
					strncat(ret, file->info->format, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, file->info->format, ret_size - ret_used);
				}
				break;
			case 'u':
				f = current_file ? current_file : gib_list_find_by_data(filelist, file);
				snprintf(buf, sizeof(buf), "%d", f ? gib_list_num(filelist, f) + 1 : 0);
				strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
				strncat(ret, buf, ret_size - ret_used);
				break;
			case 'v':
				strncat(ret, VERSION, sizeof(ret) - strlen(ret) - 1);
				strncat(ret, VERSION, ret_size - ret_used);
				break;
			case 'V':
				snprintf(buf, sizeof(buf), "%d", getpid());
				strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
				strncat(ret, buf, ret_size - ret_used);
				break;
			case 'w':
				if (file && (file->info || !feh_file_info_load(file, NULL))) {
					snprintf(buf, sizeof(buf), "%d", file->info->width);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				}
				break;
			case 'W':
				if (winwid) {
					snprintf(buf, sizeof(buf), "%dx%d+%d+%d", winwid->w, winwid->h, winwid->x, winwid->y);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				}
				break;
			case 'z':
				if (winwid) {
					snprintf(buf, sizeof(buf), "%.2f", winwid->zoom);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				} else {
					strncat(ret, "1.00", sizeof(ret) - strlen(ret) - 1);
					strncat(ret, "1.00", ret_size - ret_used);
				}
				break;
			case 'Z':
				if (winwid) {
					snprintf(buf, sizeof(buf), "%f", winwid->zoom);
					strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
					strncat(ret, buf, ret_size - ret_used);
				}
				break;
			case '%':
				strncat(ret, "%", sizeof(ret) - strlen(ret) - 1);
				strncat(ret, "%", ret_size - ret_used);
				break;
			default:
				weprintf("Unrecognized format specifier %%%c", *c);
				if ((strlen(ret) + 3) < sizeof(ret))
				if ((strlen(ret) + 3) < ret_size) {
					strncat(ret, c - 1, 2);
				}
				break;
			}
		} else if ((*c == '\\') && (*(c+1) != '\0') && ((strlen(ret) + 3) < sizeof(ret))) {
		} else if ((*c == '\\') && (*(c+1) != '\0') && ((strlen(ret) + 3) < ret_size)) {
			c++;
			switch (*c) {
			case 'n':
@@ -568,11 +590,13 @@ char *feh_printf(char *str, feh_file * file, winwidget winwid)
				strncat(ret, c - 1, 2);
				break;
			}
		} else if ((strlen(ret) + 2) < sizeof(ret))
		} else if ((strlen(ret) + 2) < ret_size) {
			strncat(ret, c, 1);
		}
	if (filelist_tmppath != NULL)
	}
	if (filelist_tmppath != NULL) {
		free(filelist_tmppath);
	}
	return(ret);
}

+3 −1
Original line number Diff line number Diff line
@@ -327,8 +327,10 @@ void init_thumbnail_mode(void)

			lineno = 0;
			if (opt.index_info) {
				line = lines = feh_wrap_string(create_index_string(file),
				char *tmp = create_index_string(file);
				line = lines = feh_wrap_string(tmp,
						opt.thumb_w * 3, td.font_main, NULL);
				free(tmp);

				while (line) {
					gib_imlib_get_text_size(td.font_main, (char *) line -> data,
Loading