static char *duplicate_backslashes(char *s, ptrdiff_t len) { char *m; ptrdiff_t x, count; for (x = count = 0; x != len; ++x) if (s[x] == '\\') ++count; m = vsmk(len + count); for (x = 0; x != len; ++x) { m = vsadd(m, s[x]); if (s[x] == '\\') m = vsadd(m, '\\'); } return m; }
void HMM::Mstep(double* N, double* M, double* NU, double* Naux, double* Maux, double* absdif, double eps) { // normalize NU, N, M double sum; vsadd(NU, 1, &eps, NU, 1, hs); sve(NU, 1, &sum, hs); vsdiv(NU, 1, &sum, NU, 1, hs); for(int i = 0; i < hs; i++) { vsadd(N+i*hs, 1, &eps, N+i*hs, 1, hs); sve(N+i*hs, 1, &sum, hs); vsdiv(N+i*hs, 1, &sum, N+i*hs, 1, hs); vsadd(M+i*os, 1, &eps, M+i*os, 1, os); sve(M+i*os, 1, &sum, os); vsdiv(M+i*os, 1, &sum, M+i*os, 1, os); } // absdif *absdif = 0; double absdif_; vsub(N, 1, Q, 1, Naux, 1, hs*hs); svemg(Naux, 1, &absdif_, hs*hs); *absdif += absdif_; vsub(M, 1, g, 1, Maux, 1, hs*os); svemg(Maux, 1, &absdif_, hs*os); *absdif += absdif_; vsub(NU, 1, nu, 1, Naux, 1, hs); svemg(Naux, 1, &absdif_, hs); *absdif += absdif_; // nu=NU Q=N g=M memcpy(nu, NU, hs*sizeof(double)); memcpy(Q, N, hs*hs*sizeof(double)); memcpy(g, M, hs*os*sizeof(double)); }
/* When called with c==-1, it just creates the prompt */ static int itype(W *w, int c, void *obj, int *notify) { IREC *i; int omid; BW *bw; struct isrch *isrch = (struct isrch *)obj; WIND_BW(bw,w); if (isrch->quote) { goto in; } if (c == 8 || c == 127) { /* Backup */ if ((i = isrch->irecs.link.prev) != &isrch->irecs) { pgoto(bw->cursor, i->disp); if (globalsrch) globalsrch->wrap_flag = i->wrap_flag; omid = opt_mid; opt_mid = 1; dofollows(); opt_mid = omid; isrch->pattern = vstrunc(isrch->pattern, sLEN(isrch->pattern) - i->what); frirec(deque_f(IREC, link, i)); } else { if(joe_beep) ttputc(7); } } else if (c == 'Q' - '@' /* || c == '`' */) { isrch->quote = 1; } else if (c == 'S' - '@' || c == '\\' - '@' || c == 'L' - '@' || c == 'R' - '@') { /* Repeat */ if (c == 'R' - '@') { isrch->dir = 1; } else { isrch->dir = 0; } if (qempty(IREC, link, &isrch->irecs)) { if (lastpat && lastpat[0]) { iappend(bw, isrch, sv(lastpat)); } } else { SRCH *srch; i = alirec(); i->disp = i->start = bw->cursor->byte; i->what = 0; if (!globalsrch) srch = mksrch(NULL,NULL,opt_icase,isrch->dir,-1,0,0,0,0); else { srch = globalsrch; globalsrch = 0; } srch->addr = bw->cursor->byte; if (!srch->wrap_p || srch->wrap_p->b!=bw->b) { prm(srch->wrap_p); srch->wrap_p = pdup(bw->cursor, "itype"); srch->wrap_p->owner = &srch->wrap_p; srch->wrap_flag = 0; } i->wrap_flag = srch->wrap_flag; setpat(srch, vsncpy(NULL, 0, isrch->pattern, sLen(isrch->pattern))); srch->backwards = isrch->dir; if (dopfnext(bw, srch, NULL)) { if(joe_beep) ttputc(7); frirec(i); } else { enqueb(IREC, link, &isrch->irecs, i); } } } else if (c >= 0 && c < 32) { /* Done when a control character is received */ nungetc(c); if (notify) { *notify = 1; } smode = 2; if (lastisrch) { lastpat = vstrunc(lastpat, 0); lastpat = vsncpy(lastpat, 0, lastisrch->pattern, sLen(lastisrch->pattern)); rmisrch(lastisrch); } lastisrch = isrch; return 0; } else if (c != -1) { char buf[16]; ptrdiff_t buf_len; /* Search */ in: if (bw->b->o.charmap->type) { buf_len = utf8_encode(buf, c); } else { buf[0] = TO_CHAR_OK(from_uni(bw->b->o.charmap, c)); buf_len = 1; } isrch->quote = 0; iappend(bw, isrch, buf, buf_len); } omid = opt_mid; opt_mid = 1; bw->cursor->xcol = piscol(bw->cursor); dofollows(); opt_mid = omid; isrch->prompt = vstrunc(isrch->prompt, isrch->ofst); if (locale_map->type && !bw->b->o.charmap->type) { /* Translate bytes to utf-8 */ char buf[16]; int x; for (x=0; x!=sLEN(isrch->pattern); ++x) { int tc = to_uni(bw->b->o.charmap, isrch->pattern[x]); utf8_encode(buf, tc); isrch->prompt = vsncpy(sv(isrch->prompt),sz(buf)); } } else if (!locale_map->type && bw->b->o.charmap->type) { /* Translate utf-8 to bytes */ const char *p = isrch->pattern; ptrdiff_t len = sLEN(isrch->pattern); while (len) { int tc = utf8_decode_fwrd(&p, &len); if (tc >= 0) { tc = from_uni(locale_map, tc); isrch->prompt = vsadd(isrch->prompt, TO_CHAR_OK(tc)); } } } else { /* FIXME: translate when charmaps do not match */ isrch->prompt = vsncpy(sv(isrch->prompt),sv(isrch->pattern)); } if (mkqwnsr(bw->parent, sv(isrch->prompt), itype, iabrt, isrch, notify)) { return 0; } else { rmisrch(isrch); return -1; } }
/* static */char *stagen(char *stalin, BW *bw, const char *s, char fill) { char buf[80]; int x; int field; W *w = bw->parent; time_t n=time(NULL); struct tm *cas; cas=localtime(&n); stalin = vstrunc(stalin, 0); while (*s) { if (*s == '%' && s[1]) { field = 0; ++s; while (*s >= '0' && *s <= '9' && s[1]) { field = field * 10 + *s - '0'; ++s; } switch (*s) { case 'v': /* Version of JOE */ { joe_snprintf_1(buf, SIZEOF(buf), "%s", VERSION); stalin = vsncpy(sv(stalin), sz(buf)); } break; case 'x': /* Context (but only if autoindent is enabled) */ { if ( bw->o.autoindent) { char *ts = get_context(bw); /* We need to translate between file's character set to locale */ my_iconv(stdbuf, SIZEOF(stdbuf), locale_map,ts,bw->o.charmap); stalin = vsncpy(sv(stalin), sz(stdbuf)); } } break; case 'y': { if (bw->o.syntax) { joe_snprintf_1(buf, SIZEOF(buf), "(%s)", bw->o.syntax->name); stalin = vsncpy(sv(stalin), sz(buf)); } } break; case 't': { time_t curtime = time(NULL); int l; char *d = ctime(&curtime); l = (d[11] - '0') * 10 + d[12] - '0'; if (l > 12) l -= 12; joe_snprintf_1(buf, SIZEOF(buf), "%2.2d", l); if (buf[0] == '0') buf[0] = fill; stalin = vsncpy(sv(stalin), buf, 2); stalin = vsncpy(sv(stalin), d + 13, 3); } break; case 'd': { if (s[1]) switch (*++s) { case 'd' : joe_snprintf_1(buf, SIZEOF(buf), "%02d",cas->tm_mday); break; case 'm' : joe_snprintf_1(buf, SIZEOF(buf), "%02d",cas->tm_mon + 1); break; case 'y' : joe_snprintf_1(buf, SIZEOF(buf), "%02d",cas->tm_year % 100); break; case 'Y' : joe_snprintf_1(buf, SIZEOF(buf), "%04d",cas->tm_year + 1900); break; case 'w' : joe_snprintf_1(buf, SIZEOF(buf), "%d",cas->tm_wday); break; case 'D' : joe_snprintf_1(buf, SIZEOF(buf), "%03d",cas->tm_yday); break; default : buf[0]='d'; buf[1]=*s; buf[2]=0; } else { buf[0]='d'; buf[1]=0; } stalin=vsncpy(sv(stalin),sz(buf)); } break; case 'E': { char *ch; int l; buf[0]=0; for(l=0;s[l+1] && s[l+1] != '%'; l++) buf[l]=s[l+1]; if (s[l+1]=='%' && buf[0]) { buf[l]=0; s+=l+1; ch=getenv(buf); if (ch) stalin=vsncpy(sv(stalin),sz(ch)); } } break; case 'Z': { const char *ch; int l; buf[0]=0; for(l=0;s[l+1] && s[l+1] != '%'; l++) buf[l]=s[l+1]; if (s[l+1]=='%' && buf[0]) { buf[l]=0; s+=l+1; ch=get_status(bw, buf); if (ch) stalin=vsncpy(sv(stalin),sz(ch)); } } break; case 'u': { time_t curtime = time(NULL); char *d = ctime(&curtime); stalin = vsncpy(sv(stalin), d + 11, 5); } break; case 'T': if (bw->o.overtype) stalin = vsadd(stalin, 'O'); else stalin = vsadd(stalin, 'I'); break; case 'W': if (bw->o.wordwrap) stalin = vsadd(stalin, 'W'); else stalin = vsadd(stalin, fill); break; case 'I': if (bw->o.autoindent) stalin = vsadd(stalin, 'A'); else stalin = vsadd(stalin, fill); break; case 'X': if (square) stalin = vsadd(stalin, 'X'); else stalin = vsadd(stalin, fill); break; case 'n': { if (bw->b->name) { char *tmp = simplify_prefix(bw->b->name); char *tmp1 = duplicate_backslashes(sv(tmp)); vsrm(tmp); stalin = vsncpy(sv(stalin), sv(tmp1)); vsrm(tmp1); } else { stalin = vsncpy(sv(stalin), sz(joe_gettext(_("Unnamed")))); } } break; case 'm': if (bw->b->changed) stalin = vsncpy(sv(stalin), sz(joe_gettext(_("(Modified)")))); break; case 'R': if (bw->b->rdonly) stalin = vsncpy(sv(stalin), sz(joe_gettext(_("(Read only)")))); break; case '*': if (bw->b->changed) stalin = vsadd(stalin, '*'); else stalin = vsadd(stalin, fill); break; case 'r': if (field) #ifdef HAVE_LONG_LONG joe_snprintf_1(buf, SIZEOF(buf), "%-4lld", (long long)(bw->cursor->line + 1)); #else joe_snprintf_1(buf, SIZEOF(buf), "%-4ld", (long)(bw->cursor->line + 1)); #endif else #ifdef HAVE_LONG_LONG joe_snprintf_1(buf, SIZEOF(buf), "%lld", (long long)(bw->cursor->line + 1)); #else joe_snprintf_1(buf, SIZEOF(buf), "%ld", (long)(bw->cursor->line + 1)); #endif for (x = 0; buf[x]; ++x) if (buf[x] == ' ') buf[x] = fill; stalin = vsncpy(sv(stalin), sz(buf)); break; case 'o': if (field) #ifdef HAVE_LONG_LONG joe_snprintf_1(buf, SIZEOF(buf), "%-4lld", (long long)bw->cursor->byte); #else joe_snprintf_1(buf, SIZEOF(buf), "%-4ld", (long)bw->cursor->byte); #endif else #ifdef HAVE_LONG_LONG joe_snprintf_1(buf, SIZEOF(buf), "%lld", (long long)bw->cursor->byte); #else joe_snprintf_1(buf, SIZEOF(buf), "%ld", (long)bw->cursor->byte); #endif for (x = 0; buf[x]; ++x) if (buf[x] == ' ') buf[x] = fill; stalin = vsncpy(sv(stalin), sz(buf)); break; case 'O': if (field) #ifdef HAVE_LONG_LONG joe_snprintf_1(buf, SIZEOF(buf), "%-4llX", (unsigned long long)bw->cursor->byte); #else joe_snprintf_1(buf, SIZEOF(buf), "%-4lX", (unsigned long)bw->cursor->byte); #endif else