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