patch 8.1.0614: placing signs can be complicated

Problem:    Placing signs can be complicated.
Solution:   Add functions for defining and placing signs.  Introduce a group
            name to avoid different plugins using the same signs. (Yegappan
            Lakshmanan, closes #3652)
diff --git a/src/proto/buffer.pro b/src/proto/buffer.pro
index 131ac82..0a7a616 100644
--- a/src/proto/buffer.pro
+++ b/src/proto/buffer.pro
@@ -69,17 +69,22 @@
 void switch_to_win_for_buf(buf_T *buf, win_T **save_curwinp, tabpage_T **save_curtabp, bufref_T *save_curbuf);
 void restore_win_for_buf(win_T *save_curwin, tabpage_T *save_curtab, bufref_T *save_curbuf);
 int find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp);
-void buf_addsign(buf_T *buf, int id, linenr_T lnum, int typenr);
-linenr_T buf_change_sign_type(buf_T *buf, int markId, int typenr);
+void buf_addsign(buf_T *buf, int id, char_u *group, int prio, linenr_T lnum, int typenr);
+linenr_T buf_change_sign_type(buf_T *buf, int markId, char_u *group, int typenr);
 int buf_getsigntype(buf_T *buf, linenr_T lnum, int type);
-linenr_T buf_delsign(buf_T *buf, int id);
-int buf_findsign(buf_T *buf, int id);
+linenr_T buf_delsign(buf_T *buf, int id, char_u *group);
+int buf_findsign(buf_T *buf, int id, char_u *group);
+#ifdef FEAT_SIGNS
+int sign_in_group(signlist_T *sign, char_u *group);
+dict_T *sign_get_info(signlist_T *sign);
+signlist_T *buf_getsign_with_id(buf_T *buf, int id, char_u *group);
+#endif
 int buf_findsign_id(buf_T *buf, linenr_T lnum);
 int buf_findsigntype_id(buf_T *buf, linenr_T lnum, int typenr);
 int buf_signcount(buf_T *buf, linenr_T lnum);
-void buf_delete_signs(buf_T *buf);
+void buf_delete_signs(buf_T *buf, char_u *group);
 void buf_delete_all_signs(void);
-void sign_list_placed(buf_T *rbuf);
+void sign_list_placed(buf_T *rbuf, char_u *sign_group);
 void sign_mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after);
 void set_buflisted(int on);
 int buf_contents_changed(buf_T *buf);
diff --git a/src/proto/ex_cmds.pro b/src/proto/ex_cmds.pro
index 12e6b38..00d0217 100644
--- a/src/proto/ex_cmds.pro
+++ b/src/proto/ex_cmds.pro
@@ -61,10 +61,17 @@
 void *sign_get_image(int typenr);
 char_u *sign_typenr2name(int typenr);
 void free_signs(void);
+void free_signs(void);
 char_u *get_sign_name(expand_T *xp, int idx);
 void set_context_in_sign_cmd(expand_T *xp, char_u *arg);
 void ex_smile(exarg_T *eap);
 void ex_drop(exarg_T *eap);
 char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags);
 void ex_oldfiles(exarg_T *eap);
+int sign_define_by_name(char_u *name, char_u *icon, char_u *linehl, char_u *text, char_u *texthl);
+int sign_undefine_by_name(char_u *name);
+void sign_getlist(char_u *name, list_T *retlist);
+int sign_place(int *sign_id, char_u *group, char_u *sign_name, buf_T *buf, linenr_T lnum, int prio);
+int sign_unplace(int id, char_u *group, buf_T *buf);
+void sign_get_placed(buf_T *buf, linenr_T lnum, int id, char_u *group, list_T *retlist);
 /* vim: set ft=c : */
diff --git a/src/proto/list.pro b/src/proto/list.pro
index 2f0b404..88d9028 100644
--- a/src/proto/list.pro
+++ b/src/proto/list.pro
@@ -5,6 +5,7 @@
 list_T *list_alloc(void);
 list_T *list_alloc_id(alloc_id_T id);
 int rettv_list_alloc(typval_T *rettv);
+int rettv_list_alloc_id(typval_T *rettv, alloc_id_T id);
 void rettv_list_set(typval_T *rettv, list_T *l);
 void list_unref(list_T *l);
 int list_free_nonref(int copyID);
diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro
index 949ff72..b54337b 100644
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -24,6 +24,7 @@
 char_u *alloc(unsigned size);
 char_u *alloc_id(unsigned size, alloc_id_T id);
 char_u *alloc_clear(unsigned size);
+char_u * alloc_clear_id(unsigned size, alloc_id_T id);
 char_u *alloc_check(unsigned size);
 char_u *lalloc_clear(long_u size, int message);
 char_u *lalloc(long_u size, int message);