frutil.c - sam - An updated version of the sam text editor.
(HTM) git clone git://vernunftzentrum.de/sam.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
frutil.c (2179B)
---
1 /* Copyright (c) 1998 Lucent Technologies - All rights reserved. */
2 #include <u.h>
3 #include <libg.h>
4 #include <frame.h>
5
6 int
7 _frcanfit(Frame *f, Point pt, Frbox *b)
8 {
9 int left, w, nr;
10 uint8_t *p;
11 wchar_t r;
12
13 left = f->r.max.x-pt.x;
14 if(b->nrune < 0)
15 return b->a.b.minwid <= left;
16 if(left >= b->wid)
17 return b->nrune;
18 for(nr=0,p=b->a.ptr; *p; p+=w,nr++){
19 r = *p;
20 w = chartorune(&r, (char*)p);
21 left -= charwidth(f->font, r);
22 if(left < 0)
23 return nr;
24 }
25 berror("_frcanfit can't");
26 return 0;
27 }
28
29 void
30 _frcklinewrap(Frame *f, Point *p, Frbox *b)
31 {
32 if((b->nrune<0? b->a.b.minwid : b->wid) > f->r.max.x-p->x){
33 p->x = f->left;
34 p->y += f->fheight;
35 }
36 }
37
38 void
39 _frcklinewrap0(Frame *f, Point *p, Frbox *b)
40 {
41 if(_frcanfit(f, *p, b) == 0){
42 p->x = f->left;
43 p->y += f->fheight;
44 }
45 }
46
47 void
48 _fradvance(Frame *f, Point *p, Frbox *b)
49 {
50 if(b->nrune<0 && b->a.b.bc=='\n'){
51 p->x = f->left;
52 p->y += f->fheight;
53 }else
54 p->x += b->wid;
55 }
56
57 int
58 _frnewwid(Frame *f, Point pt, Frbox *b)
59 {
60 int c, x;
61
62 c = f->r.max.x;
63 x = pt.x;
64 if(b->nrune >= 0)
65 return b->wid;
66 if(b->a.b.bc == '\t'){
67 if(x+b->a.b.minwid > c)
68 x = pt.x = f->left;
69 x += f->maxtab;
70 x -= (x-f->left)%f->maxtab;
71 if(x-pt.x<b->a.b.minwid || x>c)
72 x = pt.x+b->a.b.minwid;
73 b->wid = x-pt.x;
74 }
75 return b->wid;
76 }
77
78 void
79 _frclean(Frame *f, Point pt, int n0, int n1) /* look for mergeable boxes */
80 {
81 Frbox *b;
82 int nb, c;
83
84 c = f->r.max.x;
85 for(nb=n0; nb<n1-1; nb++){
86 b = &f->box[nb];
87 _frcklinewrap(f, &pt, b);
88 while(b[0].nrune>=0 && nb<n1-1 && b[1].nrune>=0 && pt.x+b[0].wid+b[1].wid<c){
89 _frmergebox(f, nb);
90 n1--;
91 b = &f->box[nb];
92 }
93 _fradvance(f, &pt, &f->box[nb]);
94 }
95 for(; nb<f->nbox; nb++){
96 b = &f->box[nb];
97 _frcklinewrap(f, &pt, b);
98 _fradvance(f, &pt, &f->box[nb]);
99 }
100 f->lastlinefull = false;
101 if(pt.y >= f->r.max.y)
102 f->lastlinefull = true;
103 }