summaryrefslogtreecommitdiff
path: root/usr.bin/less/mark.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/less/mark.c')
-rw-r--r--usr.bin/less/mark.c74
1 files changed, 33 insertions, 41 deletions
diff --git a/usr.bin/less/mark.c b/usr.bin/less/mark.c
index 4641a29385b..04f97885d10 100644
--- a/usr.bin/less/mark.c
+++ b/usr.bin/less/mark.c
@@ -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 @@ struct mark {
/*
* 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 @@ init_mark()
for (i = 0; i < NMARKS; i++)
marks[i].m_scrpos.pos = NULL_POSITION;
- lmark.m_scrpos.pos = NULL_POSITION;
}
/*
@@ -93,7 +70,7 @@ getumark(c)
getmark(c)
int c;
{
- struct mark *m;
+ register struct mark *m;
static struct mark sm;
switch (c)
@@ -126,15 +103,14 @@ getmark(c)
* 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 @@ badmark(c)
setmark(c)
int c;
{
- struct mark *m;
+ register struct mark *m;
struct scrpos scrpos;
m = getumark(c);
@@ -189,11 +165,13 @@ lastmark()
{
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 @@ lastmark()
gomark(c)
int c;
{
- struct mark *m;
+ register struct mark *m;
struct scrpos scrpos;
m = getmark(c);
@@ -215,7 +193,7 @@ gomark(c)
* 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 @@ gomark(c)
markpos(c)
int c;
{
- struct mark *m;
+ register struct mark *m;
m = getmark(c);
if (m == NULL)
@@ -264,3 +242,17 @@ markpos(c)
}
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;
+}