int strexp(register char* s, int flags) { register char* t; register int c; char* b; char* e; int w; Mbstate_t q; b = t = s; while (c = *s++) { if (c == '\\') { c = chrexp(s - 1, &e, &w, flags); s = e; if (c < 0) continue; if (w) { mbinit(&q); t += mbconv(t, c, &q); continue; } } *t++ = c; } *t = 0; return t - b; }
/* * returns the line and column corresponding to offset <off> in the physical buffer * if <cur> is non-zero and <= <off>, then correspodning <curpos> will start the search */ Edpos_t ed_curpos(Edit_t *ep,genchar *phys, int off, int cur, Edpos_t curpos) { register genchar *sp=phys; register int c=1, col=ep->e_plen; Edpos_t pos; #if SHOPT_MULTIBYTE char p[16]; #endif /* SHOPT_MULTIBYTE */ if(cur && off>=cur) { sp += cur; off -= cur; pos = curpos; col = pos.col; } else { pos.line = 0; while(col > ep->e_winsz) { pos.line++; col -= (ep->e_winsz+1); } } while(off-->0) { if(c) c = *sp++; #if SHOPT_MULTIBYTE if(c && (mbconv(p, (wchar_t)c))==1 && p[0]=='\n') #else if(c=='\n') #endif /* SHOPT_MULTIBYTE */ col = 0; else col++; if(col > ep->e_winsz) col = 0; if(col==0) pos.line++; } pos.col = col; return(pos); }
void ed_putchar(register Edit_t *ep,register int c) { char buf[8]; register char *dp = ep->e_outptr; register int i,size=1; if(!dp) return; buf[0] = c; #if SHOPT_MULTIBYTE /* check for place holder */ if(c == MARKER) return; if((size = mbconv(buf, (wchar_t)c)) > 1) { for (i = 0; i < (size-1); i++) *dp++ = buf[i]; c = buf[i]; } else { buf[0] = c; size = 1; } #endif /* SHOPT_MULTIBYTE */ if (buf[0] == '_' && size==1) { *dp++ = ' '; *dp++ = '\b'; } *dp++ = c; *dp = '\0'; if(dp >= ep->e_outlast) ed_flush(ep); else ep->e_outptr = dp; }