1#ifndef DEFINE_FUNC_ATTRIBUTES
2# define DEFINE_FUNC_ATTRIBUTES
3#endif
4#include "nvim/func_attr.h"
5#undef DEFINE_FUNC_ATTRIBUTES
6static int efm_to_regpat(char_u *efm, int len, efm_T *fmt_ptr, char_u *regpat, char_u *errmsg);
7static void free_efm_list(efm_T **efm_first);
8static efm_T *parse_efm_option(char_u *efm);
9static char_u *qf_grow_linebuf(qfstate_T *state, size_t newsz);
10static int qf_get_next_str_line(qfstate_T *state);
11static int qf_get_next_list_line(qfstate_T *state);
12static int qf_get_next_buf_line(qfstate_T *state);
13static int qf_get_next_file_line(qfstate_T *state);
14static int qf_get_nextline(qfstate_T *state);
15static _Bool qf_list_empty(const qf_info_T *qi, int qf_idx) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT;
16static int qf_parse_line(qf_info_T *qi, int qf_idx, char_u *linebuf, size_t linelen, efm_T *fmt_first, qffields_T *fields);
17static int qf_init_ext(qf_info_T *qi, int qf_idx, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast, char_u *qf_title, char_u *enc );
18static void qf_store_title(qf_info_T *qi, int qf_idx, const char_u *title) FUNC_ATTR_NONNULL_ARG(1);
19static char_u *qf_cmdtitle(char_u *cmd);
20static void qf_new_list(qf_info_T *qi, char_u *qf_title);
21static int qf_parse_match(char_u *linebuf, size_t linelen, efm_T *fmt_ptr, regmatch_T *regmatch, qffields_T *fields, int qf_multiline, int qf_multiscan, char_u **tail);
22static int qf_parse_get_fields(char_u *linebuf, size_t linelen, efm_T *fmt_ptr, qffields_T *fields, int qf_multiline, int qf_multiscan, char_u **tail);
23static int qf_parse_dir_pfx(int idx, qffields_T *fields, qf_list_T *qfl);
24static int qf_parse_file_pfx(int idx, qffields_T *fields, qf_list_T *qfl, char_u *tail);
25static int qf_parse_line_nomatch(char_u *linebuf, size_t linelen, qffields_T *fields);
26static int qf_parse_multiline_pfx(qf_info_T *qi, int qf_idx, int idx, qf_list_T *qfl, qffields_T *fields);
27static void ll_free_all(qf_info_T **pqi);
28static int qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname, char_u *module, int bufnum, char_u *mesg, long lnum, int col, char_u vis_col, char_u *pattern, int nr, char_u type, char_u valid);
29static qf_info_T *ll_new_list(void);
30static qf_info_T *ll_get_or_alloc_list(win_T *wp);
31static int qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *directory, char_u *fname);
32static char_u *qf_push_dir(char_u *dirbuf, struct dir_stack_T **stackptr, _Bool is_file_stack);
33static char_u *qf_pop_dir(struct dir_stack_T **stackptr);
34static void qf_clean_dir_stack(struct dir_stack_T **stackptr);
35static char_u *qf_guess_filepath(qf_info_T *qi, int qf_idx, char_u *filename);
36static _Bool qflist_valid(win_T *wp, unsigned int qf_id);
37static _Bool is_qf_entry_present(qf_info_T *qi, qfline_T *qf_ptr);
38static qfline_T *get_next_valid_entry(qf_info_T *qi, qfline_T *qf_ptr, int *qf_index, int dir);
39static qfline_T *get_prev_valid_entry(qf_info_T *qi, qfline_T *qf_ptr, int *qf_index, int dir);
40static qfline_T *get_nth_valid_entry(qf_info_T *qi, int errornr, qfline_T *qf_ptr, int *qf_index, int dir);
41static qfline_T *get_nth_entry(qf_info_T *qi, int errornr, qfline_T *qf_ptr, int *cur_qfidx);
42static int jump_to_help_window(qf_info_T *qi, int *opened_window);
43static int qf_jump_to_usable_window(int qf_fnum, int *opened_window);
44static int qf_jump_edit_buffer(qf_info_T *qi, qfline_T *qf_ptr, int forceit, win_T *oldwin, int *opened_window, int *abort);
45static void qf_jump_goto_line(linenr_T qf_lnum, int qf_col, char_u qf_viscol, char_u *qf_pattern);
46static void qf_jump_print_msg(qf_info_T *qi, int qf_index, qfline_T *qf_ptr, buf_T *old_curbuf, linenr_T old_lnum);
47static void qf_fmt_text(char_u *text, char_u *buf, int bufsize);
48static void qf_msg(qf_info_T *qi, int which, char *lead);
49static void qf_free_items(qf_info_T *qi, int idx);
50static void qf_free(qf_info_T *qi, int idx);
51static char_u *qf_types(int c, int nr);
52static void qf_win_goto(win_T *win, linenr_T lnum);
53static int qf_win_pos_update(qf_info_T *qi, int old_qf_index );
54static int is_qf_win(win_T *win, qf_info_T *qi);
55static win_T *qf_find_win(qf_info_T *qi);
56static buf_T *qf_find_buf(qf_info_T *qi);
57static void qf_update_win_titlevar(qf_info_T *qi);
58static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last);
59static void qf_set_title_var(qf_info_T *qi);
60static void qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last);
61static void qf_list_changed(qf_info_T *qi, int qf_idx);
62static int qf_id2nr(const qf_info_T *const qi, const unsigned qfid);
63static int qf_restore_list(qf_info_T *qi, unsigned save_qfid) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT;
64static void qf_jump_first(qf_info_T *qi, unsigned save_qfid, int forceit) FUNC_ATTR_NONNULL_ALL;
65static char_u *get_mef_name(void);
66static size_t qf_get_nth_valid_entry(qf_info_T *qi, size_t n, _Bool fdo) FUNC_ATTR_NONNULL_ALL;
67static char_u *vgr_get_auname(cmdidx_T cmdidx);
68static void vgr_init_regmatch(regmmatch_T *regmatch, char_u *s);
69static void vgr_display_fname(char_u *fname);
70static buf_T *vgr_load_dummy_buf(char_u *fname, char_u *dirname_start, char_u *dirname_now);
71static _Bool vgr_qflist_valid(win_T *wp, qf_info_T *qi, unsigned qfid, char_u *title);
72static _Bool vgr_match_buflines(qf_info_T *qi, char_u *fname, buf_T *buf, regmmatch_T *regmatch, long tomatch, int duplicate_name, int flags);
73static void vgr_jump_to_match(qf_info_T *qi, int forceit, int *redraw_for_dummy, buf_T *first_match_buf, char_u *target_dir);
74static void restore_start_dir(char_u *dirname_start);
75static buf_T *load_dummy_buffer(char_u *fname, char_u *dirname_start, char_u *resulting_dir );
76static void wipe_dummy_buffer(buf_T *buf, char_u *dirname_start);
77static void unload_dummy_buffer(buf_T *buf, char_u *dirname_start);
78static int qf_get_list_from_lines(dict_T *what, dictitem_T *di, dict_T *retdict);
79static int qf_winid(qf_info_T *qi);
80static int qf_getprop_keys2flags(dict_T *what);
81static int qf_getprop_qfidx(qf_info_T *qi, dict_T *what);
82static int qf_getprop_defaults(qf_info_T *qi, int flags, dict_T *retdict);
83static int qf_getprop_title(qf_info_T *qi, int qf_idx, dict_T *retdict);
84static int qf_getprop_items(qf_info_T *qi, int qf_idx, dict_T *retdict);
85static int qf_getprop_ctx(qf_info_T *qi, int qf_idx, dict_T *retdict);
86static int qf_getprop_idx(qf_info_T *qi, int qf_idx, dict_T *retdict);
87static int qf_add_entries(qf_info_T *qi, int qf_idx, list_T *list, char_u *title, int action);
88static int qf_setprop_get_qfidx(const qf_info_T *qi, const dict_T *what, int action, _Bool *newlist) FUNC_ATTR_NONNULL_ALL;
89static int qf_setprop_title(qf_info_T *qi, int qf_idx, const dict_T *what, const dictitem_T *di) FUNC_ATTR_NONNULL_ALL;
90static int qf_setprop_items(qf_info_T *qi, int qf_idx, dictitem_T *di, int action) FUNC_ATTR_NONNULL_ALL;
91static int qf_setprop_items_from_lines(qf_info_T *qi, int qf_idx, const dict_T *what, dictitem_T *di, int action) FUNC_ATTR_NONNULL_ALL;
92static int qf_setprop_context(qf_info_T *qi, int qf_idx, dictitem_T *di) FUNC_ATTR_NONNULL_ALL;
93static int qf_set_properties(qf_info_T *qi, const dict_T *what, int action, char_u *title) FUNC_ATTR_NONNULL_ALL;
94static win_T *find_win_with_ll(qf_info_T *qi);
95static void qf_free_stack(win_T *wp, qf_info_T *qi);
96static _Bool mark_quickfix_ctx(qf_info_T *qi, int copyID);
97#include "nvim/func_attr.h"
98