Annotation of coherent/d/usr/bin/elvis/move2.c, revision 1.1

1.1     ! root        1: /* move2.c */
        !             2: 
        !             3: /* Author:
        !             4:  *     Steve Kirkendall
        !             5:  *     16820 SW Tallac Way
        !             6:  *     Beaverton, OR 97006
        !             7:  *     [email protected], or ...uunet!tektronix!psueea!jove!kirkenda
        !             8:  */
        !             9: 
        !            10: 
        !            11: /* This function contains the movement functions that perform RE searching */
        !            12: 
        !            13: #include "config.h"
        !            14: #include "vi.h"
        !            15: #include "regexp.h"
        !            16: 
        !            17: extern long    atol();
        !            18: 
        !            19: static regexp  *re;    /* compiled version of the pattern to search for */
        !            20: static         prevsf; /* boolean: previous search direction was forward? */
        !            21: 
        !            22: MARK   m_nsrch(m)
        !            23:        MARK    m;      /* where to start searching */
        !            24: {
        !            25:        if (prevsf)
        !            26:        {
        !            27:                m = m_fsrch(m, (char *)0);
        !            28:                prevsf = TRUE;
        !            29:        }
        !            30:        else
        !            31:        {
        !            32:                m = m_bsrch(m, (char *)0);
        !            33:                prevsf = FALSE;
        !            34:        }
        !            35:        return m;
        !            36: }
        !            37: 
        !            38: MARK   m_Nsrch(m)
        !            39:        MARK    m;      /* where to start searching */
        !            40: {
        !            41:        if (prevsf)
        !            42:        {
        !            43:                m = m_bsrch(m, (char *)0);
        !            44:                prevsf = TRUE;
        !            45:        }
        !            46:        else
        !            47:        {
        !            48:                m = m_fsrch(m, (char *)0);
        !            49:                prevsf = FALSE;
        !            50:        }
        !            51:        return m;
        !            52: }
        !            53: 
        !            54: MARK   m_fsrch(m, ptrn)
        !            55:        MARK    m;      /* where to start searching */
        !            56:        char    *ptrn;  /* pattern to search for */
        !            57: {
        !            58:        long    l;      /* line# of line to be searched */
        !            59:        char    *line;  /* text of line to be searched */
        !            60:        int     wrapped;/* boolean: has our search wrapped yet? */
        !            61:        int     pos;    /* where we are in the line */
        !            62:        long    delta;  /* line offset, for things like "/foo/+1" */
        !            63: 
        !            64:        /* remember: "previous search was forward" */
        !            65:        prevsf = TRUE;
        !            66: 
        !            67:        delta = 0L;
        !            68:        if (ptrn && *ptrn)
        !            69:        {
        !            70:                /* locate the closing '/', if any */
        !            71:                line = parseptrn(ptrn);
        !            72:                if (*line)
        !            73:                {
        !            74:                        delta = atol(line);
        !            75:                }
        !            76:                ptrn++;
        !            77: 
        !            78:                /* free the previous pattern */
        !            79:                if (re) free(re);
        !            80: 
        !            81:                /* compile the pattern */
        !            82:                re = regcomp(ptrn);
        !            83:                if (!re)
        !            84:                {
        !            85:                        return MARK_UNSET;
        !            86:                }
        !            87:        }
        !            88:        else if (!re)
        !            89:        {
        !            90:                msg("No previous expression");
        !            91:                return MARK_UNSET;
        !            92:        }
        !            93: 
        !            94:        /* search forward for the pattern */
        !            95:        pos = markidx(m) + 1;
        !            96:        pfetch(markline(m));
        !            97:        if (pos >= plen)
        !            98:        {
        !            99:                pos = 0;
        !           100:                m = (m | (BLKSIZE - 1)) + 1;
        !           101:        }
        !           102:        wrapped = FALSE;
        !           103:        for (l = markline(m); l != markline(m) + 1 || !wrapped; l++)
        !           104:        {
        !           105:                /* wrap search */
        !           106:                if (l > nlines)
        !           107:                {
        !           108:                        /* if we wrapped once already, then the search failed */
        !           109:                        if (wrapped)
        !           110:                        {
        !           111:                                break;
        !           112:                        }
        !           113: 
        !           114:                        /* else maybe we should wrap now? */
        !           115:                        if (*o_wrapscan)
        !           116:                        {
        !           117:                                l = 0;
        !           118:                                wrapped = TRUE;
        !           119:                                continue;
        !           120:                        }
        !           121:                        else
        !           122:                        {
        !           123:                                break;
        !           124:                        }
        !           125:                }
        !           126: 
        !           127:                /* get this line */
        !           128:                line = fetchline(l);
        !           129: 
        !           130:                /* check this line */
        !           131:                if (regexec(re, &line[pos], (pos == 0)))
        !           132:                {
        !           133:                        /* match! */
        !           134:                        if (wrapped && *o_warn)
        !           135:                                msg("(wrapped)");
        !           136:                        if (delta != 0L)
        !           137:                        {
        !           138:                                l += delta;
        !           139:                                if (l < 1 || l > nlines)
        !           140:                                {
        !           141:                                        msg("search offset too big");
        !           142:                                        return MARK_UNSET;
        !           143:                                }
        !           144:                                return m_front(MARK_AT_LINE(l), 0L);
        !           145:                        }
        !           146:                        return MARK_AT_LINE(l) + (int)(re->startp[0] - line);
        !           147:                }
        !           148:                pos = 0;
        !           149:        }
        !           150: 
        !           151:        /* not found */
        !           152:        msg(*o_wrapscan ? "Not found" : "Hit bottom without finding RE");
        !           153:        return MARK_UNSET;
        !           154: }
        !           155: 
        !           156: MARK   m_bsrch(m, ptrn)
        !           157:        MARK    m;      /* where to start searching */
        !           158:        char    *ptrn;  /* pattern to search for */
        !           159: {
        !           160:        long    l;      /* line# of line to be searched */
        !           161:        char    *line;  /* text of line to be searched */
        !           162:        int     wrapped;/* boolean: has our search wrapped yet? */
        !           163:        int     pos;    /* last acceptable idx for a match on this line */
        !           164:        int     last;   /* remembered idx of the last acceptable match on this line */
        !           165:        int     try;    /* an idx at which we strat searching for another match */
        !           166: 
        !           167:        /* remember: "previous search was not forward" */
        !           168:        prevsf = FALSE;
        !           169: 
        !           170:        if (ptrn && *ptrn)
        !           171:        {
        !           172:                /* locate the closing '?', if any */
        !           173:                line = parseptrn(ptrn);
        !           174:                ptrn++;
        !           175: 
        !           176:                /* free the previous pattern, if any */
        !           177:                if (re) free(re);
        !           178: 
        !           179:                /* compile the pattern */
        !           180:                re = regcomp(ptrn);
        !           181:                if (!re)
        !           182:                {
        !           183:                        return MARK_UNSET;
        !           184:                }
        !           185:        }
        !           186:        else if (!re)
        !           187:        {
        !           188:                msg("No previous expression");
        !           189:                return MARK_UNSET;
        !           190:        }
        !           191: 
        !           192:        /* search backward for the pattern */
        !           193:        pos = markidx(m);
        !           194:        wrapped = FALSE;
        !           195:        for (l = markline(m); l != markline(m) - 1 || !wrapped; l--)
        !           196:        {
        !           197:                /* wrap search */
        !           198:                if (l < 1)
        !           199:                {
        !           200:                        if (*o_wrapscan)
        !           201:                        {
        !           202:                                l = nlines + 1;
        !           203:                                wrapped = TRUE;
        !           204:                                continue;
        !           205:                        }
        !           206:                        else
        !           207:                        {
        !           208:                                break;
        !           209:                        }
        !           210:                }
        !           211: 
        !           212:                /* get this line */
        !           213:                line = fetchline(l);
        !           214: 
        !           215:                /* check this line */
        !           216:                if (regexec(re, line, 1) && (int)(re->startp[0] - line) < pos)
        !           217:                {
        !           218:                        /* match!  now find the last acceptable one in this line */
        !           219:                        do
        !           220:                        {
        !           221:                                last = (int)(re->startp[0] - line);
        !           222:                                try = (int)(re->endp[0] - line);
        !           223:                        } while (try > 0
        !           224:                                 && regexec(re, &line[try], FALSE)
        !           225:                                 && (int)(re->startp[0] - line) < pos);
        !           226: 
        !           227:                        if (wrapped && *o_warn)
        !           228:                                msg("(wrapped)");
        !           229:                        return MARK_AT_LINE(l) + last;
        !           230:                }
        !           231:                pos = BLKSIZE;
        !           232:        }
        !           233: 
        !           234:        /* not found */
        !           235:        msg(*o_wrapscan ? "Not found" : "Hit top without finding RE");
        !           236:        return MARK_UNSET;
        !           237: }
        !           238: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.