1 /*--------------------------------------------------------------------
2   display module.
3 
4     Copyright (c) 1998,1999,2000 SASAKI Shunsuke.
5     All rights reserved.
6 --------------------------------------------------------------------*/
7 #include	"ed.h"
8 
9 
dsp_fmtinit(const char * s,dspfmt_t * dfp)10 dspfmt_t	*dsp_fmtinit(const char *s, dspfmt_t *dfp)
11 {
12 	dspfmt_t *dfpb;
13 
14 	dfpb=mem_alloc(sizeof(dspfmt_t));
15 
16 	if (dfp!=NULL)
17 		dfp->next=dfpb;
18 
19 	dfpb->col=AC_normal;
20 	dfpb->str=mem_alloc(strlen(s)+1);
21 	strcpy(dfpb->str, s);
22 	dfpb->next=NULL;
23 
24 	return dfpb;
25 }
26 
dsp_fmtsfin(dspfmt_t * dfp)27 void	dsp_fmtsfin(dspfmt_t *dfp)
28 {
29 	dspfmt_t	*next;
30 
31 //fprintf(stderr,"dsp_fmtsfin %p\n",dfp);
32 
33 	while(dfp!=NULL)
34 		{
35 		 next=dfp->next;
36 		 free(dfp->str);
37 		 free(dfp);
38 		 dfp=next;
39 		}
40 }
41 
42 /*
43 void	df_debug(dspfmt_t *dfp)
44 {
45 	while(dfp!=NULL)
46 		{
47 		 fprintf(stderr,"[%s] %02x\n",dfp->str,dfp->col);
48 		 dfp=dfp->next;
49 		}
50 	fprintf(stderr,"\n");
51 }
52 */
53 
dsp_regresize(dspreg_t * drp,int sizex,int sizey)54 void	dsp_regresize(dspreg_t *drp,int sizex,int sizey)
55 {
56 	int 	i,a;
57 
58 	if (sizex> dspall.sizex)
59 		sizex= dspall.sizex;
60 	if (sizey> dspall.sizey)
61 		sizey= dspall.sizey;
62 
63 	if (sizex!=-1)
64 		drp->sizex=sizex;
65 
66 	if (sizey!=-1|| drp->sizey!= sizey)
67 		{
68 		 drp->sizey= sizey;
69 
70 		 a=drp->y+ sizey -dspall.sizey;
71 		 if (a>0)
72 		 	 drp->y-=a;
73 		}
74 }
75 
76 
dsp_regview(dspreg_t * drp)77 void	dsp_regview(dspreg_t *drp)
78 {
79 	dspfmt_t	*dfp, *dfp_b;
80 	char		*p;
81 	int 		n,m,a,b,i;
82 
83 	char		spc_buf[LN_dspbuf+1];
84 
85 	for (i=0;i<drp->sizey;++i)
86 		{
87 //fprintf(stderr,"**\n");
88 
89 		 dfp=drp->func(drp->vp, i, drp->sizex, drp->sizey);
90 		 if (dfp==NULL)
91 		 	continue;
92 
93 		 dfp_b = dfp;
94 		 p=dfp->str;
95 		 n=drp->sizex;
96 		 m=0;
97 
98 		 memset(spc_buf, ' ', n);
99 		 spc_buf[n]='\0';
100 
101 		 for (;;)
102 		 	{
103 		 	 if (*p=='\0')
104 		 	 	{
105 //fprintf(stderr," *%p\n", dfp->next);
106 		 	 	 if (dfp->next==NULL)
107 		 	 	 	p=spc_buf; else
108 		 	 	 	{
109 		 	 	 	 dfp=dfp->next;
110 		 	 	 	 p=dfp->str;
111 		 	 	 	}
112 		 	 	}
113 //fprintf(stderr,"*>[%s]\n",p);
114 
115 		 	 a= min(strlen(p),n-m);
116 
117 		 	 term_color(dfp->col);
118 		 	 term_locate(drp->y+i, drp->x +m);
119 		 	 widthputs(p,a);
120 
121 		 	 m+=a;
122 		 	 p+=a;
123 
124 //fprintf(stderr,"---\n");
125 
126 		 	 if (m>=drp->sizex)
127 		 	 	break;
128 		 	}
129 
130 		 dsp_fmtsfin(dfp_b);
131 		}
132 //fprintf(stderr,"-\n");
133 }
134 
dsp_reginit()135 dspreg_t	*dsp_reginit()
136 {
137 	dspreg_t	*drp;
138 
139 	drp=(dspreg_t *)mem_alloc(sizeof(dspreg_t));
140 	drp->x=0;
141 	drp->y=0;
142 	drp->sizex=dspall.sizex;
143 	drp->sizey=dspall.sizey;
144 	drp->vp=NULL;
145 
146 // fprintf(stderr,"reg_ini %p\n",drp);
147 
148 	return drp;
149 }
150 
dsp_regexist(dspreg_t * drp)151 int 	dsp_regexist(dspreg_t *drp)
152 {
153 	int 	i;
154 
155 //	if (drp==NULL)
156 //		return -1;
157 
158 	for (i=0; i<dspall.drp_num; ++i)
159 		{
160 		 if (drp== dspall.drp[i])
161 		 	return i;
162 		}
163 
164 	return -1;
165 }
166 
dsp_regadd(dspreg_t * drp)167 void	dsp_regadd(dspreg_t *drp)
168 {
169 // fprintf(stderr,"reg_add %p\n",drp);
170 	if (dspall.drp_num>=MAX_dspreg || dsp_regexist(drp)!=-1)
171 		return;
172 
173 	dspall.drp[dspall.drp_num]=drp;
174 	++dspall.drp_num;
175 }
176 
177 
dsp_regrm(dspreg_t * drp)178 void	dsp_regrm(dspreg_t *drp)
179 {
180 	int 	i;
181 
182 // fprintf(stderr,"reg_rm %p\n",drp);
183 
184 	i=dsp_regexist(drp);
185 	if (i==-1)
186 		return;
187 
188 
189 	if (i+1<dspall.drp_num)
190 		memcpy(&dspall.drp[i], &dspall.drp[i+1]
191 							, sizeof(dspreg_t *) * dspall.drp_num-i-1);
192 	--dspall.drp_num;
193 }
194 
dsp_regfin(dspreg_t * drp)195 void	dsp_regfin(dspreg_t *drp)
196 {
197 	int 	i;
198 
199 // fprintf(stderr,"reg_fin\n",drp);
200 
201 	dsp_regrm(drp);
202 
203 	free(drp);
204 }
205 
206 
dsp_allinit()207 void	dsp_allinit()
208 {
209 	dspall.drp_num=0;
210 	dspall.sizex= term_sizex()-1;
211 	dspall.sizey= GetMaxRow()+1;	//!!
212 
213 }
214 
dsp_allview()215 void	dsp_allview()
216 {
217 	int 	i;
218 
219 
220 // fprintf(stderr,"!%d\n", dspall.drp_num);
221 
222 	for (i=0;i<dspall.drp_num;++i)
223 		{
224 //fprintf(stderr,"* %p ",dspall.drp[i]);
225 		 dsp_regview(dspall.drp[i]);
226 		}
227 //fprintf(stderr,"*\n",dspall.drp[i]);
228 }
229 
230