=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/less/mark.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- src/usr.bin/less/mark.c 2001/11/19 19:02:14 1.3 +++ src/usr.bin/less/mark.c 2003/04/13 18:26:26 1.4 @@ -1,34 +1,15 @@ -/* $OpenBSD: mark.c,v 1.3 2001/11/19 19:02:14 mpech Exp $ */ - /* - * Copyright (c) 1984,1985,1989,1994,1995 Mark Nudelman - * All rights reserved. + * Copyright (C) 1984-2002 Mark Nudelman * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice in the documentation and/or other materials provided with - * the distribution. + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * For more information about less, or for information on how to + * contact the author, see the README file. */ #include "less.h" -#include "position.h" extern IFILE curr_ifile; extern int sc_height; @@ -45,16 +26,13 @@ /* * The table of marks. * Each mark is identified by a lowercase or uppercase letter. + * The final one is lmark, for the "last mark"; addressed by the apostrophe. */ -#define NMARKS (2*26) /* a-z, A-Z */ +#define NMARKS ((2*26)+1) /* a-z, A-Z, lastmark */ +#define LASTMARK (NMARKS-1) static struct mark marks[NMARKS]; /* - * Special mark for the "last mark"; addressed by the apostrophe. - */ -static struct mark lmark; - -/* * Initialize the mark table to show no marks are set. */ public void @@ -64,7 +42,6 @@ for (i = 0; i < NMARKS; i++) marks[i].m_scrpos.pos = NULL_POSITION; - lmark.m_scrpos.pos = NULL_POSITION; } /* @@ -93,7 +70,7 @@ getmark(c) int c; { - struct mark *m; + register struct mark *m; static struct mark sm; switch (c) @@ -126,15 +103,14 @@ * Current position in the current file. */ m = &sm; - m->m_scrpos.pos = ch_tell(); - m->m_scrpos.ln = 0; + get_scrpos(&m->m_scrpos); m->m_ifile = curr_ifile; break; case '\'': /* * The "last mark". */ - m = &lmark; + m = &marks[LASTMARK]; break; default: /* @@ -170,7 +146,7 @@ setmark(c) int c; { - struct mark *m; + register struct mark *m; struct scrpos scrpos; m = getumark(c); @@ -189,11 +165,13 @@ { struct scrpos scrpos; + if (ch_getflags() & CH_HELPFILE) + return; get_scrpos(&scrpos); if (scrpos.pos == NULL_POSITION) return; - lmark.m_scrpos = scrpos; - lmark.m_ifile = curr_ifile; + marks[LASTMARK].m_scrpos = scrpos; + marks[LASTMARK].m_ifile = curr_ifile; } /* @@ -203,7 +181,7 @@ gomark(c) int c; { - struct mark *m; + register struct mark *m; struct scrpos scrpos; m = getmark(c); @@ -215,7 +193,7 @@ * it has not been set to anything yet, * set it to the beginning of the current file. */ - if (m == &lmark && m->m_scrpos.pos == NULL_POSITION) + if (m == &marks[LASTMARK] && m->m_scrpos.pos == NULL_POSITION) { m->m_ifile = curr_ifile; m->m_scrpos.pos = ch_zero(); @@ -251,7 +229,7 @@ markpos(c) int c; { - struct mark *m; + register struct mark *m; m = getmark(c); if (m == NULL) @@ -263,4 +241,18 @@ return (NULL_POSITION); } return (m->m_scrpos.pos); +} + +/* + * Clear the marks associated with a specified ifile. + */ + public void +unmark(ifile) + IFILE ifile; +{ + int i; + + for (i = 0; i < NMARKS; i++) + if (marks[i].m_ifile == ifile) + marks[i].m_scrpos.pos = NULL_POSITION; }