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 }