diff options
Diffstat (limited to 'src/calendar.c')
-rw-r--r-- | src/calendar.c | 125 |
1 files changed, 67 insertions, 58 deletions
diff --git a/src/calendar.c b/src/calendar.c index 1240547..06d80d7 100644 --- a/src/calendar.c +++ b/src/calendar.c @@ -20,6 +20,7 @@ struct state_s { size_t line, col; size_t last_line, last_col; struct entry_interval_s cur_warn; + struct entry_interval_s cur_stay; bool cur_urgent; bool cur_local; FILE *f; @@ -30,6 +31,7 @@ enum cmd_type_e { CMD_TYPE_WARN, CMD_TYPE_URGENT, CMD_TYPE_LOCAL, + CMD_TYPE_STAY, }; struct cmd_s { @@ -364,6 +366,17 @@ static inline struct cmd_s sub_get_cmd_warn(struct state_s *s) return cmd; } +static inline struct cmd_s sub_get_cmd_stay(struct state_s *s) +{ + struct cmd_s cmd = { + .type = CMD_TYPE_STAY + }; + + cmd.iv = sub_get_interval(s); + + return cmd; +} + static bool sub_get_bool(struct state_s *s) { bool r = false; @@ -526,7 +539,19 @@ static inline struct cmd_s sub_get_cmd(struct state_s *s) ) { s->col += 5; sub_eat_spaces(s); - return sub_get_cmd_urgent(s); + return sub_get_cmd_local(s); + } + break; + + case 's': + if ( + getc(s->f) == 't' && + getc(s->f) == 'a' && + getc(s->f) == 'y' + ) { + s->col += 4; + sub_eat_spaces(s); + return sub_get_cmd_stay(s); } break; } @@ -545,7 +570,7 @@ static char* sub_get_msg(struct state_s *s) while ( (c = getc(s->f)) != '\n' && c != EOF) { s->col++; - if (count == width) { + if (count == width || count + 1 == width) { width += step_size; msg = realloc(msg, width * sizeof(*msg)); @@ -568,6 +593,7 @@ static char* sub_get_msg(struct state_s *s) count++; } + msg[count] = '\0'; s->col = 0; s->line++; @@ -577,10 +603,18 @@ static char* sub_get_msg(struct state_s *s) static inline struct entry_s sub_get_entry_on(struct state_s *s) { struct entry_s e = { - .type = ENTRY_TYPE_ON + .type = ENTRY_TYPE_ON, + .urgent = s->cur_urgent, + .local = s->cur_local, + .warn = s->cur_warn, + .stay = s->cur_stay, }; time_t rt; int c; + struct pos_s p = { + .line = s->last_line, + .col = s->last_col, + }; rt = sub_get_date(s); if (s->err_flag) @@ -593,19 +627,10 @@ static inline struct entry_s sub_get_entry_on(struct state_s *s) c = getc(s->f); if (c != ',') { - if (c == 'w' - && getc(s->f) == 'a' - && getc(s->f) == 'r' - && getc(s->f) == 'n' - ) { - s->col += 4; - e.warn = sub_get_interval(s); - if (s->err_flag) - return e; - } else { - ungetc(c, s->f); - return e; - } + sub_set_pos(s, p); + ERRP("invalid calendar entry"); + s->err_flag = true; + return e; } s->col++; @@ -622,8 +647,9 @@ static inline struct entry_s sub_get_entry_every(struct state_s *s) .urgent = s->cur_urgent, .local = s->cur_local, .warn = s->cur_warn, + .stay = s->cur_stay, }; - bool from_seen = false, to_seen = false, warn_seen = false; + bool from_seen = false, to_seen = false; char c; struct pos_s p = { .line = s->last_line, @@ -685,29 +711,6 @@ static inline struct entry_s sub_get_entry_every(struct state_s *s) break; } - case 'w': - if ( - getc(s->f) == 'a' && - getc(s->f) == 'r' && - getc(s->f) == 'n' - ) { - if (warn_seen) { - ERRP("invalid calendar entry"); - s->err_flag = true; - return e; - } - warn_seen = true; - - s->col += 4; - sub_eat_spaces(s); - e.warn = sub_get_interval(s); - - if (s->err_flag) - return e; - - break; - } - default: goto done; } @@ -792,22 +795,6 @@ static inline void sub_cal_push(struct state_s *s, struct calendar_s *cal, cal->count++; } -static void sub_cal_free(struct calendar_s *cal) -{ - size_t i; - - if (cal->entries == NULL) - return; - - for (i = 0; i < cal->count; i++) { - if (cal->entries[i].msg != NULL) - free(cal->entries[i].msg); - } - - free(cal->entries); - cal->entries = NULL; -} - struct calendar_s calendar_parse(FILE *f) { struct calendar_s cal = { @@ -821,6 +808,9 @@ struct calendar_s calendar_parse(FILE *f) .cur_warn = { .day = 1, }, + .cur_stay = { + .day = 1, + }, .cur_urgent = false, .cur_local = true, .f = f, @@ -843,7 +833,7 @@ struct calendar_s calendar_parse(FILE *f) cmd = sub_get_cmd(&s); if (s.err_flag) { - sub_cal_free(&cal); + calendar_wipe(&cal); cal.err_flag = true; return cal; } @@ -858,6 +848,9 @@ struct calendar_s calendar_parse(FILE *f) case CMD_TYPE_LOCAL: s.cur_local = cmd.b; break; + case CMD_TYPE_STAY: + s.cur_stay = cmd.iv; + break; } continue; @@ -867,7 +860,7 @@ struct calendar_s calendar_parse(FILE *f) e = sub_get_entry(&s); if (s.err_flag) { - sub_cal_free(&cal); + calendar_wipe(&cal); cal.err_flag = true; return cal; } @@ -876,3 +869,19 @@ struct calendar_s calendar_parse(FILE *f) return cal; } + +void calendar_wipe(struct calendar_s *cal) +{ + size_t i; + + if (cal->entries == NULL) + return; + + for (i = 0; i < cal->count; i++) { + if (cal->entries[i].msg != NULL) + free(cal->entries[i].msg); + } + + free(cal->entries); + cal->entries = NULL; +} |