comparison src/window.c @ 1326:22886f3d882d v7.1.040

updated for version 7.1-040
author vimboss
date Thu, 26 Jul 2007 20:58:42 +0000
parents f89c43568067
children 06e0f7482cef
comparison
equal deleted inserted replaced
1325:f26d0c74a329 1326:22886f3d882d
73 static void restore_snapshot __ARGS((int close_curwin)); 73 static void restore_snapshot __ARGS((int close_curwin));
74 static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr)); 74 static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
75 static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr)); 75 static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
76 76
77 #endif /* FEAT_WINDOWS */ 77 #endif /* FEAT_WINDOWS */
78
78 static win_T *win_alloc __ARGS((win_T *after)); 79 static win_T *win_alloc __ARGS((win_T *after));
79 static void win_new_height __ARGS((win_T *, int)); 80 static void win_new_height __ARGS((win_T *, int));
80 81
81 #define URL_SLASH 1 /* path_is_url() has found "://" */ 82 #define URL_SLASH 1 /* path_is_url() has found "://" */
82 #define URL_BACKSLASH 2 /* path_is_url() has found ":\\" */ 83 #define URL_BACKSLASH 2 /* path_is_url() has found ":\\" */
4126 foldInitWin(newwin); 4127 foldInitWin(newwin);
4127 #endif 4128 #endif
4128 #ifdef FEAT_AUTOCMD 4129 #ifdef FEAT_AUTOCMD
4129 --autocmd_block; 4130 --autocmd_block;
4130 #endif 4131 #endif
4132 #ifdef FEAT_SEARCH_EXTRA
4133 newwin->w_match_head = NULL;
4134 newwin->w_next_match_id = 4;
4135 #endif
4131 } 4136 }
4132 return newwin; 4137 return newwin;
4133 } 4138 }
4134 4139
4135 #if defined(FEAT_WINDOWS) || defined(PROTO) 4140 #if defined(FEAT_WINDOWS) || defined(PROTO)
4183 4188
4184 for (i = 0; i < wp->w_tagstacklen; ++i) 4189 for (i = 0; i < wp->w_tagstacklen; ++i)
4185 vim_free(wp->w_tagstack[i].tagname); 4190 vim_free(wp->w_tagstack[i].tagname);
4186 4191
4187 vim_free(wp->w_localdir); 4192 vim_free(wp->w_localdir);
4193
4188 #ifdef FEAT_SEARCH_EXTRA 4194 #ifdef FEAT_SEARCH_EXTRA
4189 vim_free(wp->w_match[0].regprog); 4195 clear_matches(wp);
4190 vim_free(wp->w_match[1].regprog); 4196 #endif
4191 vim_free(wp->w_match[2].regprog); 4197
4192 #endif
4193 #ifdef FEAT_JUMPLIST 4198 #ifdef FEAT_JUMPLIST
4194 free_jumplist(wp); 4199 free_jumplist(wp);
4195 #endif 4200 #endif
4196 4201
4197 #ifdef FEAT_QUICKFIX 4202 #ifdef FEAT_QUICKFIX
6172 return TRUE; 6177 return TRUE;
6173 6178
6174 return FALSE; 6179 return FALSE;
6175 } 6180 }
6176 #endif 6181 #endif
6182
6183 #if defined(FEAT_SEARCH_EXTRA) || defined(PROTO)
6184 /*
6185 * Add match to the match list of window 'wp'. The pattern 'pat' will be
6186 * highligted with the group 'grp' with priority 'prio'.
6187 * Optionally, a desired ID 'id' can be specified (greater than or equal to 1).
6188 * If no particular ID is desired, -1 must be specified for 'id'.
6189 * Return ID of added match, -1 on failure.
6190 */
6191 int
6192 match_add(wp, grp, pat, prio, id)
6193 win_T *wp;
6194 char_u *grp;
6195 char_u *pat;
6196 int prio;
6197 int id;
6198 {
6199 matchitem_T *cur;
6200 matchitem_T *prev;
6201 matchitem_T *m;
6202 int hlg_id;
6203 regmmatch_T match;
6204
6205 if (*grp == NUL || *pat == NUL)
6206 return -1;
6207 if (id < -1 || id == 0)
6208 {
6209 EMSGN("E799: Invalid ID: %ld (must be greater than or equal to 1)", id);
6210 return -1;
6211 }
6212 if (id != -1)
6213 {
6214 cur = wp->w_match_head;
6215 while (cur != NULL)
6216 {
6217 if (cur->id == id)
6218 {
6219 EMSGN("E801: ID already taken: %ld", id);
6220 return -1;
6221 }
6222 cur = cur->next;
6223 }
6224 }
6225 if ((hlg_id = syn_namen2id(grp, STRLEN(grp))) == 0)
6226 {
6227 EMSG2(_(e_nogroup), grp);
6228 return -1;
6229 }
6230 if ((match.regprog = vim_regcomp(pat, RE_MAGIC)) == NULL)
6231 {
6232 EMSG2(_(e_invarg2), pat);
6233 return -1;
6234 }
6235
6236 /* Find available match ID. */
6237 while (id == -1)
6238 {
6239 cur = wp->w_match_head;
6240 while (cur != NULL && cur->id != wp->w_next_match_id)
6241 cur = cur->next;
6242 if (cur == NULL)
6243 id = wp->w_next_match_id;
6244 wp->w_next_match_id++;
6245 }
6246
6247 /* Build new match. */
6248 m = (matchitem_T *)alloc(sizeof(matchitem_T));
6249 m->id = id;
6250 m->priority = prio;
6251 m->pattern = vim_strsave(pat);
6252 m->hlg_id = hlg_id;
6253 m->match.regprog = match.regprog;
6254
6255 /* Insert new match. The match list is in ascending order with regard to
6256 * the match priorities. */
6257 cur = wp->w_match_head;
6258 prev = cur;
6259 while (cur != NULL && prio >= cur->priority)
6260 {
6261 prev = cur;
6262 cur = cur->next;
6263 }
6264 if (cur == prev)
6265 wp->w_match_head = m;
6266 else
6267 prev->next = m;
6268 m->next = cur;
6269
6270 redraw_later(SOME_VALID);
6271 return id;
6272 }
6273
6274 /*
6275 * Delete match with ID 'id' in the match list of window 'wp'.
6276 * Print error messages if 'perr' is TRUE.
6277 */
6278 int
6279 match_delete(wp, id, perr)
6280 win_T *wp;
6281 int id;
6282 int perr;
6283 {
6284 matchitem_T *cur = wp->w_match_head;
6285 matchitem_T *prev = cur;
6286
6287 if (id < 1)
6288 {
6289 if (perr == TRUE)
6290 EMSGN("E802: Invalid ID: %ld (must be greater than or equal to 1)",
6291 id);
6292 return -1;
6293 }
6294 while (cur != NULL && cur->id != id)
6295 {
6296 prev = cur;
6297 cur = cur->next;
6298 }
6299 if (cur == NULL)
6300 {
6301 if (perr == TRUE)
6302 EMSGN("E803: ID not found: %ld", id);
6303 return -1;
6304 }
6305 if (cur == prev)
6306 wp->w_match_head = cur->next;
6307 else
6308 prev->next = cur->next;
6309 vim_free(cur->match.regprog);
6310 vim_free(cur->pattern);
6311 vim_free(cur);
6312 redraw_later(SOME_VALID);
6313 return 0;
6314 }
6315
6316 /*
6317 * Delete all matches in the match list of window 'wp'.
6318 */
6319 void
6320 clear_matches(wp)
6321 win_T *wp;
6322 {
6323 matchitem_T *m;
6324
6325 while (wp->w_match_head != NULL)
6326 {
6327 m = wp->w_match_head->next;
6328 vim_free(wp->w_match_head->match.regprog);
6329 vim_free(wp->w_match_head->pattern);
6330 vim_free(wp->w_match_head);
6331 wp->w_match_head = m;
6332 }
6333 redraw_later(SOME_VALID);
6334 }
6335
6336 /*
6337 * Get match from ID 'id' in window 'wp'.
6338 * Return NULL if match not found.
6339 */
6340 matchitem_T *
6341 get_match(wp, id)
6342 win_T *wp;
6343 int id;
6344 {
6345 matchitem_T *cur = wp->w_match_head;
6346
6347 while (cur != NULL && cur->id != id)
6348 cur = cur->next;
6349 return cur;
6350 }
6351 #endif