static void wc(FILE *fp, const char *str) { int word = 0, rlen; Rune c; size_t nc = 0, nl = 0, nw = 0; while ((rlen = efgetrune(&c, fp, str))) { nc += (cmode == 'c' || !cmode) ? rlen : (c != Runeerror); if (c == '\n') nl++; if (!isspacerune(c)) word = 1; else if (word) { word = 0; nw++; } } if (word) nw++; tc += nc; tl += nl; tw += nw; output(str, nc, nl, nw); }
char * parse_colors(IxpMsg *m, CTuple *col) { static char Ebad[] = "bad color string"; Rune r; char c, *p; int i, j; /* '#%6x #%6x #%6x' */ p = (char*)m->pos; for(i = 0; i < 3 && p < (char*)m->end; i++) { if(*p++ != '#') return Ebad; for(j = 0; j < 6 && p < (char*)m->end; j++) if(!isxdigit(*p++)) return Ebad; chartorune(&r, p); if(i < 2) { if(r != ' ') return Ebad; p++; }else if(!isspacerune(r) && *p != '\0') return Ebad; } c = *p; *p = '\0'; loadcolor(col, (char*)m->pos); *p = c; m->pos = (uchar*)p; eatrunes(m, isspacerune, 1); return nil; }
static void fixtext1(Item **list) { Itext *text, *ntext; Item *it, *prev; Rune *s, *s1, *s2; int n; if(*list == nil) return; prev = nil; for(it=*list; it!=nil; it=prev->next) { if(it->tag!=Itexttag || forceitem(it)) goto Continue; text = (Itext *)it; s = text->s; while(*s && isspacerune(*s)) s++; if(!*s) { if(prev == nil) prev = *list = it->next; else prev->next = it->next; it->next = nil; freeitems(it); if(prev == nil) return; continue; } n = 0; while(s[n] && !isspacerune(s[n])) n++; if(!s[n]) goto Continue; s1 = runemalloc(n+1); s1 = runemove(s1, s, n); s1[n] = L'\0'; s += n; while(*s && isspacerune(*s)) s++; if(*s) { n = runestrlen(s); s2 = runemalloc(n+1); runemove(s2, s, n); s2[n] = L'\0'; ntext = emalloc(sizeof(Itext)); ntext->s = s2; ntext->ascent = text->ascent; ntext->anchorid = text->anchorid; ntext->state = text->state&~(IFbrk|IFbrksp|IFnobrk|IFcleft|IFcright); ntext->tag = text->tag; ntext->fnt = text->fnt; ntext->fg = text->fg; ntext->ul = text->ul; ntext->next = (Item *)text->next; text->next = (Item *)ntext; } free(text->s); text->s = s1; Continue: prev = it; } }
int isgraphrune(Rune r) { return !isspacerune(r) && isprintrune(r); }