diff 3rdparty/packages/uemacs/uesearch.c @ 995:48c646212b1c

'microEMACS' for OS-9. Posted to USENET net.micro.6809, 4-May-86. Picked up from Google groups
author roug
date Sun, 23 Feb 2003 21:26:32 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/3rdparty/packages/uemacs/uesearch.c	Sun Feb 23 21:26:32 2003 +0000
@@ -0,0 +1,243 @@
+/*
+ * The functions in this file implement commands that search in the forward
+ * and backward directions. There are no special characters in the search
+ * strings. Probably should have a regular expression search, or something
+ * like that.
+ *
+ * REVISION HISTORY:
+ *
+ * ?    Steve Wilhite, 1-Dec-85
+ *      - massive cleanup on code.
+ */
+
+#include        <stdio.h>
+#include        "ueed.h"
+
+/*
+ * Search forward. Get a search string from the user, and search, beginning at
+ * ".", for the string. If found, reset the "." to be just after the match
+ * string, and [perhaps] repaint the display. Bound to "C-S".
+ */
+forwsearch(f, n)
+    {
+    register LINE *clp;
+    register int cbo;
+    register LINE*tlp;
+    register int tbo;
+    register int c;
+    register char *pp;
+    register int s;
+
+    if ((s = readpattern("Search")) != TRUE)
+        return (s);
+
+    clp = curwp->w_dotp;
+    cbo = curwp->w_doto;
+
+    while (clp != curbp->b_linep)
+        {
+        if (cbo == llength(clp))
+            {
+            clp = lforw(clp);
+            cbo = 0;
+            c = '\n';
+            }
+        else
+            c = lgetc(clp, cbo++);
+
+        if (eq(c, pat[0]) != FALSE)
+            {
+            tlp = clp;
+            tbo = cbo;
+            pp  = &pat[1];
+
+            while (*pp != 0)
+                {
+                if (tlp == curbp->b_linep)
+                    goto fail;
+
+                if (tbo == llength(tlp))
+                    {
+                    tlp = lforw(tlp);
+                    tbo = 0;
+                    c = '\n';
+                    }
+                else
+                    c = lgetc(tlp, tbo++);
+
+                if (eq(c, *pp++) == FALSE)
+                    goto fail;
+                }
+
+            curwp->w_dotp  = tlp;
+            curwp->w_doto  = tbo;
+            curwp->w_flag |= WFMOVE;
+            return (TRUE);
+            }
+fail:;
+        }
+
+    mlwrite("Not found");
+    return (FALSE);
+    }
+
+/*
+ * Reverse search. Get a search string from the user, and search, starting at
+ * "." and proceeding toward the front of the buffer. If found "." is left
+ * pointing at the first character of the pattern [the last character that was
+ j matched]. Bound to "C-R".
+ */
+backsearch(f, n)
+    {
+    register LINE *clp;
+    register int cbo;
+    register LINE *tlp;
+    register int tbo;
+    register int c;
+    register char *epp;
+    register char *pp;
+    register int s;
+
+    if ((s = readpattern("Reverse search")) != TRUE)
+        return (s);
+
+    for (epp = &pat[0]; epp[1] != 0; ++epp)
+        ;
+
+    clp = curwp->w_dotp;
+    cbo = curwp->w_doto;
+
+    for (;;)
+        {
+        if (cbo == 0)
+            {
+            clp = lback(clp);
+
+            if (clp == curbp->b_linep)
+                {
+                mlwrite("Not found");
+                return (FALSE);
+                }
+
+            cbo = llength(clp)+1;
+            }
+
+        if (--cbo == llength(clp))
+            c = '\n';
+        else
+            c = lgetc(clp, cbo);
+
+        if (eq(c, *epp) != FALSE)
+            {
+            tlp = clp;
+            tbo = cbo;
+            pp  = epp;
+
+            while (pp != &pat[0])
+                {
+                if (tbo == 0)
+                    {
+                    tlp = lback(tlp);
+                    if (tlp == curbp->b_linep)
+                        goto fail;
+
+                    tbo = llength(tlp)+1;
+                    }
+
+                if (--tbo == llength(tlp))
+                    c = '\n';
+                else
+                    c = lgetc(tlp, tbo);
+
+                if (eq(c, *--pp) == FALSE)
+                    goto fail;
+                }
+
+            curwp->w_dotp  = tlp;
+            curwp->w_doto  = tbo;
+            curwp->w_flag |= WFMOVE;
+            return (TRUE);
+            }
+fail:;
+        }
+    }
+
+/*
+ * Compare two characters. The "bc" comes from the buffer. It has it's case
+ * folded out. The "pc" is from the pattern.
+ */
+eq(bc, pc)
+    int bc;
+    int pc;
+    {
+    if (bc>='a' && bc<='z')
+        bc -= 0x20;
+
+    if (pc>='a' && pc<='z')
+        pc -= 0x20;
+
+    if (bc == pc)
+        return (TRUE);
+
+    return (FALSE);
+    }
+
+/*
+ * Read a pattern. Stash it in the external variable "pat". The "pat" is not
+ * updated if the user types in an empty line. If the user typed an empty line,
+ * and there is no old pattern, it is an error. Display the old pattern, in the
+ * style of Jeff Lomicka. There is some do-it-yourself control expansion.
+ */
+readpattern(prompt)
+    char *prompt;
+    {
+    register char *cp1;
+    register char *cp2;
+    register int c;
+    register int s;
+    char tpat[NPAT+20];
+
+    cp1 = &tpat[0];                     /* Copy prompt */
+    cp2 = prompt;
+
+    while ((c = *cp2++) != '\0')
+        *cp1++ = c;
+
+    if (pat[0] != '\0')                 /* Old pattern */
+        {
+        *cp1++ = ' ';
+        *cp1++ = '[';
+        cp2 = &pat[0];
+
+        while ((c = *cp2++) != 0)
+            {
+            if (cp1 < &tpat[NPAT+20-6]) /* "??]: \0" */
+                {
+                if (c<0x20 || c==0x7F) {
+                    *cp1++ = '^';
+                    c ^= 0x40;
+                    }
+                else if (c == '%')      /* Map "%" to */
+                    *cp1++ = c;         /* "%%". */
+
+                *cp1++ = c;
+                }
+            }
+
+        *cp1++ = ']';
+        }
+
+    *cp1++ = ':';                       /* Finish prompt */
+    *cp1++ = ' ';
+    *cp1++ = '\0';
+    s = mlreply(tpat, tpat, NPAT);      /* Read pattern */
+
+    if (s == TRUE)                      /* Specified */
+        strcpy(pat, tpat);
+    else if (s == FALSE && pat[0] != 0)         /* CR, but old one */
+        s = TRUE;
+
+    return (s);
+    }
+
+