Mercurial > hg > xemacs-beta
comparison lisp/replace.el @ 2610:16738b49b833
[xemacs-hg @ 2005-02-23 22:09:13 by adrian]
[PATCH] xemacs-21.5-clean: Avoid prohibitive string consing and GC <r7j8tbas.fsf@smtprelay.t-online.de>
| author | adrian |
|---|---|
| date | Wed, 23 Feb 2005 22:09:15 +0000 |
| parents | d824841064f3 |
| children | 5df5ea55d3fc |
comparison
equal
deleted
inserted
replaced
| 2609:c2580215c222 | 2610:16738b49b833 |
|---|---|
| 245 ;; Always start on the beginning of a line. | 245 ;; Always start on the beginning of a line. |
| 246 (or (bolp) (forward-line 1)) | 246 (or (bolp) (forward-line 1)) |
| 247 | 247 |
| 248 (let ((matched-text nil) | 248 (let ((matched-text nil) |
| 249 (curmatch-start (point)) | 249 (curmatch-start (point)) |
| 250 (limit (copy-marker (point-max)))) | 250 (limit (copy-marker (point-max))) |
| 251 (matched-text-buffer (generate-new-buffer " *matched-text*")) | |
| 252 lines-matched) | |
| 251 ;; Limit search if limits were specified. | 253 ;; Limit search if limits were specified. |
| 252 (when end (setq limit (copy-marker end))) | 254 (when end (setq limit (copy-marker end))) |
| 253 | 255 |
| 254 ;; Search. Stop if we are at end of buffer or outside the | 256 ;; Search. Stop if we are at end of buffer or outside the |
| 255 ;; limit. | 257 ;; limit. |
| 257 (eobp) | 259 (eobp) |
| 258 (and limit (>= (point) limit)))) | 260 (and limit (>= (point) limit)))) |
| 259 ;; curmatch-start is first char not preserved by previous match. | 261 ;; curmatch-start is first char not preserved by previous match. |
| 260 (if (not (re-search-forward regexp limit 'move)) | 262 (if (not (re-search-forward regexp limit 'move)) |
| 261 (let ((curmatch-end limit)) | 263 (let ((curmatch-end limit)) |
| 262 (setq matched-text (concat matched-text (buffer-substring curmatch-start curmatch-end))) | 264 (append-to-buffer matched-text-buffer curmatch-start curmatch-end) |
| 263 (if delete (delete-region curmatch-start curmatch-end))) | 265 (if delete (delete-region curmatch-start curmatch-end))) |
| 264 (let ((curmatch-end (save-excursion (goto-char (match-beginning 0)) | 266 (let ((curmatch-end (save-excursion (goto-char (match-beginning 0)) |
| 265 (beginning-of-line) | 267 (beginning-of-line) |
| 266 (point)))) | 268 (point)))) |
| 267 ;; Now curmatch-end is first char preserved by the new match. | 269 ;; Now curmatch-end is first char preserved by the new match. |
| 268 (if (< curmatch-start curmatch-end) | 270 (if (< curmatch-start curmatch-end) |
| 269 (progn | 271 (progn |
| 270 (setq matched-text (concat matched-text (buffer-substring curmatch-start curmatch-end))) | 272 (append-to-buffer matched-text-buffer curmatch-start curmatch-end) |
| 271 (if delete (delete-region curmatch-start curmatch-end)))))) | 273 (if delete (delete-region curmatch-start curmatch-end)))))) |
| 272 (setq curmatch-start (save-excursion (forward-line 1) | 274 (setq curmatch-start (save-excursion (forward-line 1) |
| 273 (point))) | 275 (point))) |
| 274 ;; If the match was empty, avoid matching again at same place. | 276 ;; If the match was empty, avoid matching again at same place. |
| 275 (and (not (eobp)) (= (match-beginning 0) (match-end 0)) | 277 (and (not (eobp)) (= (match-beginning 0) (match-end 0)) |
| 276 (forward-char 1))) | 278 (forward-char 1))) |
| 277 | 279 |
| 278 ;; If any lines were matched and KILL is non-nil, insert the | 280 ;; If any lines were matched and KILL is non-nil, insert the |
| 279 ;; matched lines into the kill ring. | 281 ;; matched lines into the kill ring. |
| 282 (setq matched-text (buffer-string matched-text-buffer)) | |
| 280 (if (and matched-text kill) (kill-new matched-text)) | 283 (if (and matched-text kill) (kill-new matched-text)) |
| 281 | 284 |
| 282 ;; Return the number of matched lines. | 285 ;; Return the number of matched lines. |
| 283 (with-temp-buffer | 286 (setq lines-matched |
| 284 ;; Use concat to make a string even if matched-text is nil. | 287 (with-current-buffer matched-text-buffer |
| 285 (insert (concat matched-text)) | 288 (count-lines (point-min) (point-max)))) |
| 286 (count-lines (point-min) (point-max))) | 289 (kill-buffer matched-text-buffer) |
| 287 )))) | 290 lines-matched)))) |
| 288 | 291 |
| 289 (define-function 'keep-lines 'delete-non-matching-lines) | 292 (define-function 'keep-lines 'delete-non-matching-lines) |
| 290 (defun delete-non-matching-lines (regexp) | 293 (defun delete-non-matching-lines (regexp) |
| 291 "Delete lines that do not match REGEXP, from point to the end of the | 294 "Delete lines that do not match REGEXP, from point to the end of the |
| 292 buffer (or within the region, if it is active)." | 295 buffer (or within the region, if it is active)." |
| 356 (with-search-caps-disable-folding regexp t | 359 (with-search-caps-disable-folding regexp t |
| 357 (save-excursion | 360 (save-excursion |
| 358 (let ((matched-text nil) | 361 (let ((matched-text nil) |
| 359 (curmatch-start nil) | 362 (curmatch-start nil) |
| 360 (curmatch-end nil) | 363 (curmatch-end nil) |
| 361 (limit nil)) | 364 (limit nil) |
| 362 | 365 (matched-text-buffer (generate-new-buffer " *matched-text*")) |
| 366 lines-matched) | |
| 363 ;; Limit search if limits were specified. | 367 ;; Limit search if limits were specified. |
| 364 (when beg (goto-char beg)) | 368 (when beg (goto-char beg)) |
| 365 (when end (setq limit (copy-marker end))) | 369 (when end (setq limit (copy-marker end))) |
| 366 | 370 |
| 367 (while (and (not (eobp)) | 371 (while (and (not (eobp)) |
| 368 (re-search-forward regexp limit t)) | 372 (re-search-forward regexp limit t)) |
| 369 (setq curmatch-start (save-excursion (goto-char (match-beginning 0)) | 373 (setq curmatch-start (save-excursion (goto-char (match-beginning 0)) |
| 370 (beginning-of-line) | 374 (beginning-of-line) |
| 371 (point))) | 375 (point))) |
| 372 (setq curmatch-end (progn (forward-line 1) (point))) | 376 (setq curmatch-end (progn (forward-line 1) (point))) |
| 373 (setq matched-text (concat matched-text (buffer-substring curmatch-start curmatch-end))) | 377 (append-to-buffer matched-text-buffer curmatch-start curmatch-end) |
| 374 (if delete (delete-region curmatch-start curmatch-end))) | 378 (if delete (delete-region curmatch-start curmatch-end))) |
| 375 | 379 (setq matched-text (buffer-string matched-text-buffer)) |
| 376 (if (and matched-text kill) (kill-new matched-text)) | 380 (if (and matched-text kill) (kill-new matched-text)) |
| 377 | 381 |
| 378 ;; Return the number of matched lines. | 382 ;; Return the number of matched lines. |
| 379 (with-temp-buffer | 383 (setq lines-matched |
| 380 ;; Use concat to make a string even if matched-text is nil. | 384 (with-current-buffer matched-text-buffer |
| 381 (insert (concat matched-text)) | 385 (count-lines (point-min) (point-max)))) |
| 382 (count-lines (point-min) (point-max))) | 386 (kill-buffer matched-text-buffer) |
| 383 )))) | 387 lines-matched)))) |
| 384 | 388 |
| 385 (define-function 'flush-lines 'delete-matching-lines) | 389 (define-function 'flush-lines 'delete-matching-lines) |
| 386 (defun delete-matching-lines (regexp) | 390 (defun delete-matching-lines (regexp) |
| 387 "Delete the lines that match REGEXP, from point to the end of the | 391 "Delete the lines that match REGEXP, from point to the end of the |
| 388 buffer (or within the region, if it is active)." | 392 buffer (or within the region, if it is active)." |
