source: trunk/minix/commands/elvis/misc.c@ 10

Last change on this file since 10 was 9, checked in by Mattia Monga, 14 years ago

Minix 3.1.2a

File size: 2.1 KB
Line 
1/* misc.c */
2
3/* Author:
4 * Steve Kirkendall
5 * 14407 SW Teal Blvd. #C
6 * Beaverton, OR 97005
7 * kirkenda@cs.pdx.edu
8 */
9
10
11/* This file contains functions which didn't seem happy anywhere else */
12
13#include "config.h"
14#include "vi.h"
15
16
17/* find a particular line & return a pointer to a copy of its text */
18char *fetchline(line)
19 long line; /* line number of the line to fetch */
20{
21 int i;
22 REG char *scan; /* used to search for the line in a BLK */
23 long l; /* line number counter */
24 static BLK buf; /* holds ONLY the selected line (as string) */
25 REG char *cpy; /* used while copying the line */
26 static long nextline; /* } These four variables are used */
27 static long chglevel; /* } to implement a shortcut when */
28 static char *nextscan; /* } consecutive lines are fetched */
29 static long nextlnum; /* } */
30
31 /* can we do a shortcut? */
32 if (changes == chglevel && line == nextline)
33 {
34 scan = nextscan;
35 }
36 else
37 {
38 /* scan lnum[] to determine which block its in */
39 for (i = 1; line > lnum[i]; i++)
40 {
41 }
42 nextlnum = lnum[i];
43
44 /* fetch text of the block containing that line */
45 scan = blkget(i)->c;
46
47 /* find the line in the block */
48 for (l = lnum[i - 1]; ++l < line; )
49 {
50 while (*scan++ != '\n')
51 {
52 }
53 }
54 }
55
56 /* copy it into a block by itself, with no newline */
57 for (cpy = buf.c; *scan != '\n'; )
58 {
59 *cpy++ = *scan++;
60 }
61 *cpy = '\0';
62
63 /* maybe speed up the next call to fetchline() ? */
64 if (line < nextlnum)
65 {
66 nextline = line + 1;
67 chglevel = changes;
68 nextscan = scan + 1;
69 }
70 else
71 {
72 nextline = 0;
73 }
74
75 /* Calls to fetchline() interfere with calls to pfetch(). Make sure
76 * that pfetch() resets itself on its next invocation.
77 */
78 pchgs = 0L;
79
80 /* Return a pointer to the line's text */
81 return buf.c;
82}
83
84
85/* error message from the regexp code */
86void regerror(txt)
87 char *txt; /* an error message */
88{
89 msg("RE error: %s", txt);
90}
91
92/* This function is equivelent to the pfetch() macro */
93void pfetch(l)
94 long l; /* line number of line to fetch */
95{
96 if(l != pline || changes != pchgs)
97 {
98 pline = (l);
99 ptext = fetchline(pline);
100 plen = strlen(ptext);
101 pchgs = changes;
102 }
103}
Note: See TracBrowser for help on using the repository browser.