diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 3ba9c5393775..80cc0bc284fd 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -287,7 +287,7 @@ static int get_real_path(const char *raw_path, const char *comp_dir, #define LINEBUF_SIZE 256 #define NR_ADDITIONAL_LINES 2 -static int show_one_line(FILE *fp, int l, bool skip, bool show_num) +static int __show_one_line(FILE *fp, int l, bool skip, bool show_num) { char buf[LINEBUF_SIZE]; const char *color = show_num ? "" : PERF_COLOR_BLUE; @@ -306,16 +306,30 @@ static int show_one_line(FILE *fp, int l, bool skip, bool show_num) } while (strchr(buf, '\n') == NULL); - return 0; + return 1; error: - if (feof(fp)) + if (ferror(fp)) { pr_warning("Source file is shorter than expected.\n"); - else - pr_warning("File read error: %s\n", strerror(errno)); - - return -1; + return -1; + } + return 0; } +static int _show_one_line(FILE *fp, int l, bool skip, bool show_num) +{ + int rv = __show_one_line(fp, l, skip, show_num); + if (rv == 0) { + pr_warning("Source file is shorter than expected.\n"); + rv = -1; + } + return rv; +} + +#define show_one_line_with_num(f,l) _show_one_line(f,l,false,true) +#define show_one_line(f,l) _show_one_line(f,l,false,false) +#define skip_one_line(f,l) _show_one_line(f,l,true,false) +#define show_one_line_or_eof(f,l) __show_one_line(f,l,false,false) + /* * Show line-range always requires debuginfo to find source file and * line number. @@ -374,27 +388,27 @@ int show_line_range(struct line_range *lr, const char *module) } /* Skip to starting line number */ while (l < lr->start) { - ret = show_one_line(fp, l++, true, false); + ret = skip_one_line(fp, l++); if (ret < 0) goto end; } list_for_each_entry(ln, &lr->line_list, list) { for (; ln->line > l; l++) { - ret = show_one_line(fp, l - lr->offset, false, false); + ret = show_one_line(fp, l - lr->offset); if (ret < 0) goto end; } - ret = show_one_line(fp, l++ - lr->offset, false, true); + ret = show_one_line_with_num(fp, l++ - lr->offset); if (ret < 0) goto end; } if (lr->end == INT_MAX) lr->end = l + NR_ADDITIONAL_LINES; - while (l <= lr->end && !feof(fp)) { - ret = show_one_line(fp, l++ - lr->offset, false, false); - if (ret < 0) + while (l <= lr->end) { + ret = show_one_line_or_eof(fp, l++ - lr->offset); + if (ret <= 0) break; } end: