1 /*--------------------------------------------------------------------
2 nxeditor
3 FILE NAME:list.c
4 Programed by : I.Neva
5 R & D ADVANCED SYSTEMS. IMAGING PRODUCTS.
6 1992.06.01
7
8 Copyright (c) 1998,1999,2000 SASAKI Shunsuke.
9 All rights reserved.
10 --------------------------------------------------------------------*/
11 #include "ed.h"
12
13
14 /*Base Pointer*/
15 static EditLine Baseline[MAX_edbuf];
16 static EditLine *LastLine[MAX_edbuf];
17 static long LastOffset[MAX_edbuf];
18
19
GetTopNumber()20 long GetTopNumber() {return 1;}
GetLastNumber()21 long GetLastNumber() {return LastOffset[CurrentFileNo];}
GetTop()22 EditLine *GetTop() {return &Baseline[CurrentFileNo];}
GetLast()23 EditLine *GetLast() {return LastLine[CurrentFileNo];}
24
25
lists_debug()26 void lists_debug()
27 {
28 EditLine *ed;
29
30 ed=GetTop();
31
32 fprintf(stderr,"byte/size buffer\n");
33 while(ed!=NULL)
34 {
35 fprintf(stderr,"%4d/%4d %p[%s]\n"
36 ,ed->bytes,ed->size,ed->buffer,ed->buffer);
37 ed=ed->next;
38 }
39 fprintf(stderr,"***\n");
40 }
41
42
lists_init()43 void lists_init()
44 {
45 int i;
46
47 for (i=0;i<MAX_edbuf;++i)
48 {
49 Baseline[i].prev=NULL;
50 Baseline[i].next=NULL;
51 LastLine[i]=&Baseline[i];
52 LastOffset[i] = 0;
53 }
54 }
55
lists_clear()56 void lists_clear()
57 {
58 EditLine *p, *q;
59
60 p=Baseline[CurrentFileNo].next;
61 while(p!=NULL)
62 {
63 q=p;
64 p=p->next;
65
66 q->next = NULL;
67 q->prev = NULL;
68 free(q->buffer);
69 free(q);
70 }
71
72 Baseline[CurrentFileNo].prev = NULL;
73 Baseline[CurrentFileNo].next = NULL;
74 LastLine[CurrentFileNo] = &Baseline[CurrentFileNo];
75 LastOffset[CurrentFileNo] = 0;
76
77 csrse.bytes=0;
78 }
79
MakeLine(const char * buffer)80 EditLine *MakeLine(const char *buffer)
81 {
82 EditLine *pli;
83 int n;
84
85 pli=(EditLine *)mem_alloc(sizeof(EditLine));
86
87 n=strlen(buffer);
88 // if (n<80)
89 // n=80;
90
91 pli->buffer=(char *)mem_alloc(sizeof(char)*(n+1));
92 strcpy(pli->buffer, buffer);
93 pli->size=n;
94 pli->bytes=n;
95 return pli;
96 }
97
98
Realloc(EditLine * li,const char * s)99 void Realloc(EditLine *li,const char *s)
100 {
101 char *p;
102 size_t n;
103
104 n=strlen(s);
105 if (n>li->size)
106 {
107 li->buffer =(char *)mem_realloc(li->buffer, n+1);
108 li->size=n;
109 }
110
111 strcpy(li->buffer, s);
112 csrse.bytes=csrse.bytes+ n- li->bytes;
113 li->bytes=strlen(s);
114 }
115
AppendLast(EditLine * li)116 void AppendLast(EditLine *li)
117 {
118 EditLine *last;
119
120 last = GetLast();
121 last->next = li;
122 li->prev = last;
123 li->next = NULL;
124 ++LastOffset[CurrentFileNo];
125 LastLine[CurrentFileNo] = li;
126
127 csrse.bytes+=li->bytes;
128 }
129
InsertLine(EditLine * bli,EditLine * li)130 void InsertLine(EditLine *bli,EditLine *li)
131 {
132 if (bli->next == NULL)
133 {
134 AppendLast(li);
135 return;
136 }
137
138 bli->next->prev=li;
139 li->prev=bli;
140 li->next=bli->next;
141 bli->next=li;
142
143 LastOffset[CurrentFileNo]++;
144 csrse.bytes+=li->bytes;
145
146 // csrse.ed=NULL;
147 }
148
DeleteList(EditLine * li)149 void DeleteList(EditLine *li)
150 {
151 if (li->next != NULL)
152 li->next->prev = li->prev; else
153 LastLine[CurrentFileNo] = li->prev;
154
155 csrse.bytes-=li->bytes;
156 li->prev->next =li-> next;
157 free(li->buffer);
158 free(li);
159 LastOffset[CurrentFileNo]--;
160 }
161
162
GetList(long o_number)163 EditLine *GetList(long o_number)
164 {
165 long num,off;
166 EditLine *p;
167
168 // lists_debug();
169 off= o_number - GetLineOffset();
170
171 if (o_number <= abs(off))
172 {
173 failed:
174 num = 0;
175 p = GetTop();
176
177 while (p->next!=NULL&& num++ <o_number)
178 p = p->next;
179 return p;
180 }
181
182 if (GetLastNumber() - o_number <= abs(off))
183 {
184 num=GetLastNumber();
185 p= GetLast();
186
187 if (p==NULL)
188 goto failed; // ���äƤϤʤ�ʤ���
189
190 while(p->prev!=NULL&& num-- >o_number)
191 p=p->prev;
192 return p;
193 }
194
195 num= o_number - off;
196 p = csrse.ed;
197
198 if (p==NULL)
199 goto failed; // ������ʤ��Ϥ���
200
201 if (off < 0)
202 {
203 while (p->prev!=NULL&& off++ <0)
204 p = p->prev;
205 } else
206 {
207 while (p->next!=NULL&& off-- >0)
208 p = p->next;
209 }
210
211 return p;
212 }
213
lists_size(long n_st,long n_en)214 size_t lists_size(long n_st,long n_en)
215 {
216 long i;
217 EditLine *ed;
218 long a; /* size */
219
220 a=1;
221 ed=GetList(n_st);
222 for (i=n_st;i<=n_en;++i)
223 {
224 if (ed==NULL|| ed->buffer==NULL)
225 break;
226 a+= strlen(ed->buffer);
227 if (ed->next!=NULL)
228 ++a;
229 ed = ed->next;
230 }
231
232 return a;
233 }
234
lists_proc(void func (),void * gp,long n_st,long n_en)235 void lists_proc(void func(),void *gp,long n_st,long n_en)
236 {
237 long i;
238 EditLine *ed;
239 char buf[MAXEDITLINE+1];
240
241 ed=GetList(n_st);
242 for (i=n_st;i<=n_en;++i)
243 {
244 if (ed==NULL|| ed->buffer==NULL|| i>GetLastNumber())
245 {
246 func(NULL,gp);
247 continue;
248 }
249 if (ed->next==NULL)
250 strcpy(buf,ed->buffer); else
251 sprintf(buf,"%s\n",ed->buffer);
252 func(buf,gp);
253 ed = ed->next;
254 }
255 }
256
lists_add(void * func (),void * gp)257 void lists_add(void *func(),void *gp)
258 {
259 int n;
260 char buf[MAXEDITLINE+1];
261 EditLine *ed, *edb, *ed_new;
262
263 n=0;
264 ed_new= edb= GetList(GetLineOffset()-1);
265 while(gp!=NULL)
266 {
267 //fprintf(stderr,"%d\n",n);
268 gp=func(buf,gp);
269 //fprintf(stderr," [%s]\n",buf);
270
271 ed = MakeLine(buf);
272 InsertLine(edb, ed);
273 edb=ed;
274 ++n;
275 }
276
277 csrse.ed = ed_new -> next;
278 }
279
280
281
lists_delete(int n_st,int n_ed)282 void lists_delete(int n_st,int n_ed)
283 {
284 EditLine *ed, *ed_next, *ed_new;
285 int n;
286
287 ed_new= csrse.ed;
288 n = n_ed-n_st+1;
289 if (n_st <= GetLineOffset())
290 {
291 int m=n;
292 while (m-- >0 && ed_new != NULL)
293 ed_new=ed_new->next;
294 }
295
296 ed = GetList(n_st);
297 while (n-- >0)
298 {
299 if (n_st > GetLastNumber()) // GetLastNumber �ϰ�ư���롣
300 {
301 Realloc(ed, "");
302 return;
303 }
304 ed_next=ed->next;
305 DeleteList(ed);
306 ed=ed_next;
307 }
308
309 csrse.ed=ed_new;
310 }
311
312