Mercurial > vim
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 */ |