patch 9.0.2064: cannot use buffer-number for errorformat

Problem:  cannot use buffer-number for errorformat
Solution: add support for parsing a buffer number using '%b' in
          'errorformat'

closes: #13419

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
diff --git a/src/quickfix.c b/src/quickfix.c
index a3d3e8f..45b58c4 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -120,7 +120,7 @@
 static qf_info_T ql_info;	// global quickfix list
 static int_u last_qf_id = 0;	// Last used quickfix list id
 
-#define FMT_PATTERNS 13		// maximum number of % recognized
+#define FMT_PATTERNS 14		// maximum number of % recognized
 
 /*
  * Structure used to hold the info of one part of 'errorformat'
@@ -275,20 +275,21 @@
 } fmt_pat[FMT_PATTERNS] =
     {
 	{'f', ".\\+"},	    // only used when at end
-	{'n', "\\d\\+"},	// 1
-	{'l', "\\d\\+"},	// 2
-	{'e', "\\d\\+"},	// 3
-	{'c', "\\d\\+"},	// 4
-	{'k', "\\d\\+"},	// 5
-	{'t', "."},		// 6
-#define FMT_PATTERN_M 7
-	{'m', ".\\+"},		// 7
-#define FMT_PATTERN_R 8
-	{'r', ".*"},		// 8
-	{'p', "[-	 .]*"},	// 9
-	{'v', "\\d\\+"},	// 10
-	{'s', ".\\+"},		// 11
-	{'o', ".\\+"}		// 12
+	{'b', "\\d\\+"},	// 1
+	{'n', "\\d\\+"},	// 2
+	{'l', "\\d\\+"},	// 3
+	{'e', "\\d\\+"},	// 4
+	{'c', "\\d\\+"},	// 5
+	{'k', "\\d\\+"},	// 6
+	{'t', "."},		// 7
+#define FMT_PATTERN_M 8
+	{'m', ".\\+"},		// 8
+#define FMT_PATTERN_R 9
+	{'r', ".*"},		// 9
+	{'p', "[-	 .]*"},	// 10
+	{'v', "\\d\\+"},	// 11
+	{'s', ".\\+"},		// 12
+	{'o', ".\\+"}		// 13
     };
 
 /*
@@ -942,6 +943,7 @@
 
 typedef struct {
     char_u	*namebuf;
+    int		bnr;
     char_u	*module;
     char_u	*errmsg;
     int		errmsglen;
@@ -989,6 +991,22 @@
  * Return the matched value in "fields->enr".
  */
     static int
+qf_parse_fmt_b(regmatch_T *rmp, int midx, qffields_T *fields)
+{
+    if (rmp->startp[midx] == NULL)
+	return QF_FAIL;
+    int bnr = (int)atol((char *)rmp->startp[midx]);
+    if (buflist_findnr(bnr) == NULL)
+	return QF_FAIL;
+    fields->bnr = bnr;
+    return QF_OK;
+}
+
+/*
+ * Parse the match for error number ('%n') pattern in regmatch.
+ * Return the matched value in "fields->enr".
+ */
+    static int
 qf_parse_fmt_n(regmatch_T *rmp, int midx, qffields_T *fields)
 {
     if (rmp->startp[midx] == NULL)
@@ -1213,6 +1231,7 @@
 static int (*qf_parse_fmt[FMT_PATTERNS])(regmatch_T *, int, qffields_T *) =
 {
     NULL, // %f
+    qf_parse_fmt_b,
     qf_parse_fmt_n,
     qf_parse_fmt_l,
     qf_parse_fmt_e,
@@ -1309,6 +1328,7 @@
 	return QF_FAIL;
 
     fields->namebuf[0] = NUL;
+    fields->bnr = 0;
     fields->module[0] = NUL;
     fields->pattern[0] = NUL;
     if (!qf_multiscan)
@@ -1713,7 +1733,7 @@
 		: ((qfl->qf_currfile != NULL && fields->valid)
 		    ? qfl->qf_currfile : (char_u *)NULL),
 		fields->module,
-		0,
+		fields->bnr,
 		fields->errmsg,
 		fields->lnum,
 		fields->end_lnum,