comparison src/quickfix.c @ 1065:caa550fe4457 v7.0.191

updated for version 7.0-191
author vimboss
date Sun, 04 Feb 2007 01:58:18 +0000
parents be9fbf8b0cdb
children 7281a86ae640
comparison
equal deleted inserted replaced
1064:a8bcc7553263 1065:caa550fe4457
104 int conthere; /* %> used */ 104 int conthere; /* %> used */
105 }; 105 };
106 106
107 static int qf_init_ext __ARGS((qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast)); 107 static int qf_init_ext __ARGS((qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast));
108 static void qf_new_list __ARGS((qf_info_T *qi)); 108 static void qf_new_list __ARGS((qf_info_T *qi));
109 static int qf_add_entry __ARGS((qf_info_T *qi, qfline_T **prevp, char_u *dir, char_u *fname, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid)); 109 static int qf_add_entry __ARGS((qf_info_T *qi, qfline_T **prevp, char_u *dir, char_u *fname, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid));
110 static void qf_msg __ARGS((qf_info_T *qi)); 110 static void qf_msg __ARGS((qf_info_T *qi));
111 static void qf_free __ARGS((qf_info_T *qi, int idx)); 111 static void qf_free __ARGS((qf_info_T *qi, int idx));
112 static char_u *qf_types __ARGS((int, int)); 112 static char_u *qf_types __ARGS((int, int));
113 static int qf_get_fnum __ARGS((char_u *, char_u *)); 113 static int qf_get_fnum __ARGS((char_u *, char_u *));
114 static char_u *qf_push_dir __ARGS((char_u *, struct dir_stack_T **)); 114 static char_u *qf_push_dir __ARGS((char_u *, struct dir_stack_T **));
789 if (qf_add_entry(qi, &qfprev, 789 if (qf_add_entry(qi, &qfprev,
790 directory, 790 directory,
791 (*namebuf || directory) 791 (*namebuf || directory)
792 ? namebuf 792 ? namebuf
793 : ((currfile && valid) ? currfile : (char_u *)NULL), 793 : ((currfile && valid) ? currfile : (char_u *)NULL),
794 0,
794 errmsg, 795 errmsg,
795 lnum, 796 lnum,
796 col, 797 col,
797 use_viscol, 798 use_viscol,
798 pattern, 799 pattern,
934 /* 935 /*
935 * Add an entry to the end of the list of errors. 936 * Add an entry to the end of the list of errors.
936 * Returns OK or FAIL. 937 * Returns OK or FAIL.
937 */ 938 */
938 static int 939 static int
939 qf_add_entry(qi, prevp, dir, fname, mesg, lnum, col, vis_col, pattern, nr, type, 940 qf_add_entry(qi, prevp, dir, fname, bufnum, mesg, lnum, col, vis_col, pattern,
940 valid) 941 nr, type, valid)
941 qf_info_T *qi; /* quickfix list */ 942 qf_info_T *qi; /* quickfix list */
942 qfline_T **prevp; /* pointer to previously added entry or NULL */ 943 qfline_T **prevp; /* pointer to previously added entry or NULL */
943 char_u *dir; /* optional directory name */ 944 char_u *dir; /* optional directory name */
944 char_u *fname; /* file name or NULL */ 945 char_u *fname; /* file name or NULL */
946 int bufnum; /* buffer number or zero */
945 char_u *mesg; /* message */ 947 char_u *mesg; /* message */
946 long lnum; /* line number */ 948 long lnum; /* line number */
947 int col; /* column */ 949 int col; /* column */
948 int vis_col; /* using visual column */ 950 int vis_col; /* using visual column */
949 char_u *pattern; /* search pattern */ 951 char_u *pattern; /* search pattern */
953 { 955 {
954 qfline_T *qfp; 956 qfline_T *qfp;
955 957
956 if ((qfp = (qfline_T *)alloc((unsigned)sizeof(qfline_T))) == NULL) 958 if ((qfp = (qfline_T *)alloc((unsigned)sizeof(qfline_T))) == NULL)
957 return FAIL; 959 return FAIL;
958 qfp->qf_fnum = qf_get_fnum(dir, fname); 960 if (bufnum != 0)
961 qfp->qf_fnum = bufnum;
962 else
963 qfp->qf_fnum = qf_get_fnum(dir, fname);
959 if ((qfp->qf_text = vim_strsave(mesg)) == NULL) 964 if ((qfp->qf_text = vim_strsave(mesg)) == NULL)
960 { 965 {
961 vim_free(qfp); 966 vim_free(qfp);
962 return FAIL; 967 return FAIL;
963 } 968 }
1104 ++i, from_qfp = from_qfp->qf_next) 1109 ++i, from_qfp = from_qfp->qf_next)
1105 { 1110 {
1106 if (qf_add_entry(to->w_llist, &prevp, 1111 if (qf_add_entry(to->w_llist, &prevp,
1107 NULL, 1112 NULL,
1108 NULL, 1113 NULL,
1114 0,
1109 from_qfp->qf_text, 1115 from_qfp->qf_text,
1110 from_qfp->qf_lnum, 1116 from_qfp->qf_lnum,
1111 from_qfp->qf_col, 1117 from_qfp->qf_col,
1112 from_qfp->qf_viscol, 1118 from_qfp->qf_viscol,
1113 from_qfp->qf_pattern, 1119 from_qfp->qf_pattern,
3132 col) > 0) 3138 col) > 0)
3133 { 3139 {
3134 if (qf_add_entry(qi, &prevp, 3140 if (qf_add_entry(qi, &prevp,
3135 NULL, /* dir */ 3141 NULL, /* dir */
3136 fnames[fi], 3142 fnames[fi],
3143 0,
3137 ml_get_buf(buf, 3144 ml_get_buf(buf,
3138 regmatch.startpos[0].lnum + lnum, FALSE), 3145 regmatch.startpos[0].lnum + lnum, FALSE),
3139 regmatch.startpos[0].lnum + lnum, 3146 regmatch.startpos[0].lnum + lnum,
3140 regmatch.startpos[0].col + 1, 3147 regmatch.startpos[0].col + 1,
3141 FALSE, /* vis_col */ 3148 FALSE, /* vis_col */
3417 qf_info_T *qi = &ql_info; 3424 qf_info_T *qi = &ql_info;
3418 dict_T *dict; 3425 dict_T *dict;
3419 char_u buf[2]; 3426 char_u buf[2];
3420 qfline_T *qfp; 3427 qfline_T *qfp;
3421 int i; 3428 int i;
3429 int bufnum;
3422 3430
3423 if (wp != NULL) 3431 if (wp != NULL)
3424 { 3432 {
3425 qi = GET_LOC_LIST(wp); 3433 qi = GET_LOC_LIST(wp);
3426 if (qi == NULL) 3434 if (qi == NULL)
3432 return FAIL; 3440 return FAIL;
3433 3441
3434 qfp = qi->qf_lists[qi->qf_curlist].qf_start; 3442 qfp = qi->qf_lists[qi->qf_curlist].qf_start;
3435 for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; ++i) 3443 for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; ++i)
3436 { 3444 {
3445 /* Handle entries with a non-existing buffer number. */
3446 bufnum = qfp->qf_fnum;
3447 if (bufnum != 0 && (buflist_findnr(bufnum) == NULL))
3448 bufnum = 0;
3449
3437 if ((dict = dict_alloc()) == NULL) 3450 if ((dict = dict_alloc()) == NULL)
3438 return FAIL; 3451 return FAIL;
3439 if (list_append_dict(list, dict) == FAIL) 3452 if (list_append_dict(list, dict) == FAIL)
3440 return FAIL; 3453 return FAIL;
3441 3454
3442 buf[0] = qfp->qf_type; 3455 buf[0] = qfp->qf_type;
3443 buf[1] = NUL; 3456 buf[1] = NUL;
3444 if ( dict_add_nr_str(dict, "bufnr", (long)qfp->qf_fnum, NULL) == FAIL 3457 if ( dict_add_nr_str(dict, "bufnr", (long)bufnum, NULL) == FAIL
3445 || dict_add_nr_str(dict, "lnum", (long)qfp->qf_lnum, NULL) == FAIL 3458 || dict_add_nr_str(dict, "lnum", (long)qfp->qf_lnum, NULL) == FAIL
3446 || dict_add_nr_str(dict, "col", (long)qfp->qf_col, NULL) == FAIL 3459 || dict_add_nr_str(dict, "col", (long)qfp->qf_col, NULL) == FAIL
3447 || dict_add_nr_str(dict, "vcol", (long)qfp->qf_viscol, NULL) == FAIL 3460 || dict_add_nr_str(dict, "vcol", (long)qfp->qf_viscol, NULL) == FAIL
3448 || dict_add_nr_str(dict, "nr", (long)qfp->qf_nr, NULL) == FAIL 3461 || dict_add_nr_str(dict, "nr", (long)qfp->qf_nr, NULL) == FAIL
3449 || dict_add_nr_str(dict, "pattern", 0L, 3462 || dict_add_nr_str(dict, "pattern", 0L,
3470 int action; 3483 int action;
3471 { 3484 {
3472 listitem_T *li; 3485 listitem_T *li;
3473 dict_T *d; 3486 dict_T *d;
3474 char_u *filename, *pattern, *text, *type; 3487 char_u *filename, *pattern, *text, *type;
3488 int bufnum;
3475 long lnum; 3489 long lnum;
3476 int col, nr; 3490 int col, nr;
3477 int vcol; 3491 int vcol;
3478 qfline_T *prevp = NULL; 3492 qfline_T *prevp = NULL;
3479 int valid, status; 3493 int valid, status;
3480 int retval = OK; 3494 int retval = OK;
3481 qf_info_T *qi = &ql_info; 3495 qf_info_T *qi = &ql_info;
3496 int did_bufnr_emsg = FALSE;
3482 3497
3483 if (wp != NULL) 3498 if (wp != NULL)
3484 { 3499 {
3485 qi = ll_get_or_alloc_list(wp); 3500 qi = ll_get_or_alloc_list(wp);
3486 if (qi == NULL) 3501 if (qi == NULL)
3506 d = li->li_tv.vval.v_dict; 3521 d = li->li_tv.vval.v_dict;
3507 if (d == NULL) 3522 if (d == NULL)
3508 continue; 3523 continue;
3509 3524
3510 filename = get_dict_string(d, (char_u *)"filename", TRUE); 3525 filename = get_dict_string(d, (char_u *)"filename", TRUE);
3526 bufnum = get_dict_number(d, (char_u *)"bufnr");
3511 lnum = get_dict_number(d, (char_u *)"lnum"); 3527 lnum = get_dict_number(d, (char_u *)"lnum");
3512 col = get_dict_number(d, (char_u *)"col"); 3528 col = get_dict_number(d, (char_u *)"col");
3513 vcol = get_dict_number(d, (char_u *)"vcol"); 3529 vcol = get_dict_number(d, (char_u *)"vcol");
3514 nr = get_dict_number(d, (char_u *)"nr"); 3530 nr = get_dict_number(d, (char_u *)"nr");
3515 type = get_dict_string(d, (char_u *)"type", TRUE); 3531 type = get_dict_string(d, (char_u *)"type", TRUE);
3517 text = get_dict_string(d, (char_u *)"text", TRUE); 3533 text = get_dict_string(d, (char_u *)"text", TRUE);
3518 if (text == NULL) 3534 if (text == NULL)
3519 text = vim_strsave((char_u *)""); 3535 text = vim_strsave((char_u *)"");
3520 3536
3521 valid = TRUE; 3537 valid = TRUE;
3522 if (filename == NULL || (lnum == 0 && pattern == NULL)) 3538 if ((filename == NULL && bufnum == 0) || (lnum == 0 && pattern == NULL))
3523 valid = FALSE; 3539 valid = FALSE;
3540
3541 /* Mark entries with non-existing buffer number as not valid. Give the
3542 * error message only once. */
3543 if (bufnum != 0 && (buflist_findnr(bufnum) == NULL))
3544 {
3545 if (!did_bufnr_emsg)
3546 {
3547 did_bufnr_emsg = TRUE;
3548 EMSGN(_("E92: Buffer %ld not found"), bufnum);
3549 }
3550 valid = FALSE;
3551 bufnum = 0;
3552 }
3524 3553
3525 status = qf_add_entry(qi, &prevp, 3554 status = qf_add_entry(qi, &prevp,
3526 NULL, /* dir */ 3555 NULL, /* dir */
3527 filename, 3556 filename,
3557 bufnum,
3528 text, 3558 text,
3529 lnum, 3559 lnum,
3530 col, 3560 col,
3531 vcol, /* vis_col */ 3561 vcol, /* vis_col */
3532 pattern, /* search pattern */ 3562 pattern, /* search pattern */
3755 IObuff[--l] = NUL; 3785 IObuff[--l] = NUL;
3756 3786
3757 if (qf_add_entry(qi, &prevp, 3787 if (qf_add_entry(qi, &prevp,
3758 NULL, /* dir */ 3788 NULL, /* dir */
3759 fnames[fi], 3789 fnames[fi],
3790 0,
3760 IObuff, 3791 IObuff,
3761 lnum, 3792 lnum,
3762 (int)(regmatch.startp[0] - IObuff) 3793 (int)(regmatch.startp[0] - IObuff)
3763 + 1, /* col */ 3794 + 1, /* col */
3764 FALSE, /* vis_col */ 3795 FALSE, /* vis_col */