From fb61744f33a47899f94a1701d3d554b0a582a79b Mon Sep 17 00:00:00 2001 From: William Pettersson Date: Tue, 16 Jul 2013 19:34:29 +1000 Subject: Add -l/--limit option Adds the -l/--limit command line option. Limits the number of appointments and/or ToDo items displayed. Signed-off-by: William Pettersson Signed-off-by: Lukas Fleischer --- src/args.c | 55 +++++++++++++++++++++++++++++++++++++++---------------- src/calcurse.h | 2 +- src/day.c | 5 ++++- 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/args.c b/src/args.c index 8b1da49..76bae34 100644 --- a/src/args.c +++ b/src/args.c @@ -133,6 +133,8 @@ static void help_arg(void) " print next appointment within upcoming 24 hours " "and exit. Also given\n\tis the remaining time before this " "next appointment.\n" + "\n -l , --limit \n" + " only print information regarding the next items. \n" "\n -r[num], --range[=num]\n" " print events and appointments for the [num] number of days" "\n\tand exit. If no [num] is given, a range of 1 day is considered.\n" @@ -205,7 +207,8 @@ static void status_arg(void) * If priority == 0, only completed tasks will be displayed. * If regex is not null, only the matching todos are printed. */ -static void todo_arg(int priority, const char *format, regex_t * regex) +static void todo_arg(int priority, const char *format, regex_t * regex, + int *limit) { llist_item_t *i; int title = 1; @@ -224,6 +227,8 @@ static void todo_arg(int priority, const char *format, regex_t * regex) } while (0) LLIST_FOREACH(&todolist, i) { + if (*limit == 0) + return; struct todo *todo = LLIST_TS_GET_DATA(i); if (regex && regexec(regex, todo->mesg, 0, 0, 0) != 0) continue; @@ -232,11 +237,13 @@ static void todo_arg(int priority, const char *format, regex_t * regex) if (priority == 0) { DISPLAY_TITLE; print_todo(format, todo); + (*limit)--; } } else { if (priority < 0 || todo->id == priority) { DISPLAY_TITLE; print_todo(format, todo); + (*limit)--; } } } @@ -293,8 +300,10 @@ static void arg_print_date(long date) static int app_arg(int add_line, struct date *day, long date, const char *fmt_apt, const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, - regex_t * regex) + regex_t * regex, int *limit) { + if (*limit == 0) + return 0; if (date == 0) date = get_sec_date(*day); @@ -304,7 +313,8 @@ app_arg(int add_line, struct date *day, long date, const char *fmt_apt, if (add_line) fputs("\n", stdout); arg_print_date(date); - day_write_stdout(date, fmt_apt, fmt_rapt, fmt_ev, fmt_rev); + day_write_stdout(date, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, + limit); } return n; @@ -318,7 +328,7 @@ app_arg(int add_line, struct date *day, long date, const char *fmt_apt, static void display_app(struct tm *t, int numdays, int add_line, const char *fmt_apt, const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, - regex_t * regex) + regex_t * regex, int *limit) { int i, app_found; struct date day; @@ -329,7 +339,7 @@ display_app(struct tm *t, int numdays, int add_line, const char *fmt_apt, day.yyyy = t->tm_year + 1900; app_found = app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, - fmt_rev, regex); + fmt_rev, regex, limit); if (app_found) add_line = 1; t->tm_mday++; @@ -344,7 +354,7 @@ display_app(struct tm *t, int numdays, int add_line, const char *fmt_apt, static void date_arg(const char *ddate, int add_line, const char *fmt_apt, const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, - regex_t * regex) + regex_t * regex, int *limit) { struct date day; static struct tm t; @@ -363,13 +373,13 @@ date_arg(const char *ddate, int add_line, const char *fmt_apt, timer = time(NULL); localtime_r(&timer, &t); display_app(&t, atoi(ddate), add_line, fmt_apt, fmt_rapt, - fmt_ev, fmt_rev, regex); + fmt_ev, fmt_rev, regex, limit); } else { /* A date was entered. */ if (parse_date(ddate, conf.input_datefmt, (int *)&day.yyyy, (int *)&day.mm, (int *)&day.dd, NULL)) { app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, - fmt_ev, fmt_rev, regex); + fmt_ev, fmt_rev, regex, limit); } else { fputs(_("Argument to the '-d' flag is not valid\n"), stderr); @@ -392,7 +402,8 @@ date_arg(const char *ddate, int add_line, const char *fmt_apt, static void date_arg_extended(const char *startday, const char *range, int add_line, const char *fmt_apt, const char *fmt_rapt, - const char *fmt_ev, const char *fmt_rev, regex_t * regex) + const char *fmt_ev, const char *fmt_rev, regex_t * regex, + int *limit) { int numdays = 1, error = 0; static struct tm t; @@ -423,7 +434,7 @@ date_arg_extended(const char *startday, const char *range, int add_line, } if (!error) { display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, - fmt_ev, fmt_rev, regex); + fmt_ev, fmt_rev, regex, limit); } else { fputs(_("Argument is not valid\n"), stderr); fprintf(stdout, @@ -463,6 +474,7 @@ int parse_args(int argc, char **argv) const char *fmt_rev = " * %m\n"; const char *fmt_todo = "%p. %m\n"; + int limit = INT_MAX; /* indicates no limit requested. */ int tnum = 0, xfmt = 0, non_interactive = 0, multiple_flag = 0, load_data = 0; const char *ddate = "", *cfile = NULL, *range = NULL, *startday = @@ -476,7 +488,7 @@ int parse_args(int argc, char **argv) STATUS_OPT = CHAR_MAX + 1 }; - static const char *optstr = "ghvnNax::t::d:c:r::s::S:D:i:"; + static const char *optstr = "ghvnNax::t::d:c:r::s::S:D:i:l:"; struct option longopts[] = { {"appointment", no_argument, NULL, 'a'}, @@ -486,6 +498,7 @@ int parse_args(int argc, char **argv) {"gc", no_argument, NULL, 'g'}, {"help", no_argument, NULL, 'h'}, {"import", required_argument, NULL, 'i'}, + {"limit", required_argument, NULL, 'l'}, {"next", no_argument, NULL, 'n'}, {"note", no_argument, NULL, 'N'}, {"range", optional_argument, NULL, 'r'}, @@ -542,6 +555,9 @@ int parse_args(int argc, char **argv) load_data++; ifile = optarg; break; + case 'l': + limit = atoi(optarg); + break; case 'n': nflag = 1; multiple_flag++; @@ -646,6 +662,12 @@ int parse_args(int argc, char **argv) usage(); usage_try(); return EXIT_FAILURE; + } else if ((limit != INT_MAX) && !(aflag || dflag || rflag || sflag || tflag)) { + fputs(_("Option '-l' must be used with either '-d', '-r', '-s', " + "'-a' or '-t'\n"), stderr); + usage(); + usage_try(); + return EXIT_FAILURE; } else { if (unknown_flag) { non_interactive = 1; @@ -699,7 +721,7 @@ int parse_args(int argc, char **argv) if (tflag) { io_check_file(path_todo); io_load_todo(); - todo_arg(tnum, fmt_todo, preg); + todo_arg(tnum, fmt_todo, preg, &limit); non_interactive = 1; } if (nflag) { @@ -716,13 +738,14 @@ int parse_args(int argc, char **argv) if (dflag) date_arg(ddate, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, - preg); + preg, &limit); if (rflag || sflag) date_arg_extended(startday, range, add_line, fmt_apt, fmt_rapt, fmt_ev, - fmt_rev, preg); + fmt_rev, preg, + &limit); non_interactive = 1; } else if (aflag) { struct date day; @@ -733,8 +756,8 @@ int parse_args(int argc, char **argv) config_load(); /* To get output date format. */ io_load_app(); day.dd = day.mm = day.yyyy = 0; - app_arg(add_line, &day, 0, fmt_apt, - fmt_rapt, fmt_ev, fmt_rev, preg); + app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, + fmt_ev, fmt_rev, preg, &limit); non_interactive = 1; } } else { diff --git a/src/calcurse.h b/src/calcurse.h index da1f447..2dffe6d 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -689,7 +689,7 @@ int day_store_items(long, unsigned *, unsigned *, regex_t *); struct day_items_nb day_process_storage(struct date *, unsigned); void day_write_pad(long, int, int, int); void day_write_stdout(long, const char *, const char *, const char *, - const char *); + const char *, int *); void day_popup_item(struct day_item *); int day_check_if_item(struct date); unsigned day_chk_busy_slices(struct date, int, int *); diff --git a/src/day.c b/src/day.c index c57d983..0a1a700 100644 --- a/src/day.c +++ b/src/day.c @@ -507,11 +507,13 @@ void day_write_pad(long date, int width, int length, int incolor) /* Write the appointments and events for the selected day to stdout. */ void day_write_stdout(long date, const char *fmt_apt, const char *fmt_rapt, - const char *fmt_ev, const char *fmt_rev) + const char *fmt_ev, const char *fmt_rev, int *limit) { llist_item_t *i; LLIST_FOREACH(&day_items, i) { + if (*limit == 0) + break; struct day_item *day = LLIST_TS_GET_DATA(i); switch (day->type) { @@ -532,6 +534,7 @@ void day_write_stdout(long date, const char *fmt_apt, const char *fmt_rapt, EXIT(_("unknown item type")); /* NOTREACHED */ } + (*limit)--; } } -- cgit v1.2.3-54-g00ecf