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