annotate miscellany/less-177/ifile.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 * An IFILE represents an input file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 * It is actually a pointer to an ifile structure,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5 * but is opaque outside this module.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 * Ifile structures are kept in a linked list in the order they
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 * appear on the command line.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 * Any new file which does not already appear in the list is
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 * inserted after the current file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include "less.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 struct ifile {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 struct ifile *h_next; /* Links for command line list */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 struct ifile *h_prev;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 int h_index; /* Index within command line list */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 char *h_filename; /* Name of the file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 struct scrpos h_scrpos; /* Saved position within the file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 * Convert an IFILE (external representation)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 * to a struct file (internal representation), and vice versa.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #define int_ifile(h) ((struct ifile *)(h))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #define ext_ifile(h) ((IFILE)(h))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 * Anchor for linked list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 static struct ifile anchor = { &anchor, &anchor, 0 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 static int ifiles = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 * Allocate a new ifile structure and stick a filename in it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 * It should go after "prev" in the list
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 * (or at the beginning of the list if "prev" is NULL).
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 * Return a pointer to the new ifile structure.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 static struct ifile *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 new_ifile(filename, prev)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 char *filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 struct ifile *prev;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 register struct ifile *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 register struct ifile *np;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 * Allocate and initialize structure.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 p = (struct ifile *) ecalloc(1, sizeof(struct ifile));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 p->h_filename = filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 p->h_scrpos.pos = NULL_POSITION;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 * Link into list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 if (prev == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 prev = &anchor;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 p->h_next = prev->h_next;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 p->h_prev = prev;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 prev->h_next->h_prev = p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 prev->h_next = p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 * Calculate index for the new one,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 * and adjust the indexes for subsequent ifiles in the list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 p->h_index = prev->h_index + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 for (np = p->h_next; np != &anchor; np = np->h_next)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 np->h_index++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 ifiles++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 return (p);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 * Get the ifile after a given one in the list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 public IFILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 next_ifile(h)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 IFILE h;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 register struct ifile *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 p = (h == NULL_IFILE) ? &anchor : int_ifile(h);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 if (p->h_next == &anchor)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 return (NULL_IFILE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 return (ext_ifile(p->h_next));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 * Get the ifile before a given one in the list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 public IFILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 prev_ifile(h)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 IFILE h;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 register struct ifile *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 p = (h == NULL_IFILE) ? &anchor : int_ifile(h);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 if (p->h_prev == &anchor)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 return (NULL_IFILE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 return (ext_ifile(p->h_prev));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 * Return the number of ifiles.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 public int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 nifile()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 return (ifiles);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 * Find an ifile structure, given a filename.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 static struct ifile *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 find_ifile(filename)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 char *filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 register struct ifile *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 for (p = anchor.h_next; p != &anchor; p = p->h_next)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 if (strcmp(filename, p->h_filename) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 return (p);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 return (NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 * Get the ifile associated with a filename.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 * If the filename has not been seen before,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 * insert the new ifile after "prev" in the list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 public IFILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 get_ifile(filename, prev)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 char *filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 IFILE prev;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 register struct ifile *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 if ((p = find_ifile(filename)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 p = new_ifile(save(filename), int_ifile(prev));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 return (ext_ifile(p));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 * Get the filename associated with a ifile.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 public char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 get_filename(ifile)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 IFILE ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 if (ifile == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 return (NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 return (int_ifile(ifile)->h_filename);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 * Get the index of the file associated with a ifile.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 public int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 get_index(ifile)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 IFILE ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 return (int_ifile(ifile)->h_index);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 * Save the file position to be associated with a given file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 public void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 store_pos(ifile, scrpos)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 IFILE ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 struct scrpos *scrpos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 int_ifile(ifile)->h_scrpos = *scrpos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 * Recall the file position associated with a file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 * If no position has been associated with the file, return NULL_POSITION.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 public void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 get_pos(ifile, scrpos)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 IFILE ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 struct scrpos *scrpos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 *scrpos = int_ifile(ifile)->h_scrpos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 }