editfcns.c
来自「db.* (pronounced dee-be star) is an adva」· C语言 代码 · 共 781 行 · 第 1/2 页
C
781 行
/* find first non-alpha */ while (i >= 0 && isalpha(fldtxt[i])) --i; /* find first alpha after first blank */ while (i >= 0 && !isalpha(fldtxt[i])) --i; /* find first non-alpha */ while (i >= 0 && isalpha(fldtxt[i])) --i; } if (isalpha(fldtxt[++i])) cp = i; else beep(); return (0);}/* ================================================================ Search for string match*/static int search(){ char txt[81]; register int i, sl; tprintf("@m2300@E/"); if (rdtext(txt) > 0) strcpy(srch, txt); if ((sl = strlen(srch)) != 0) { for (i = cp + 1; i <= len - sl; ++i) if (strncmp(fldtxt + i, srch, sl) == 0) { cp = i; return (0); } } return (0);}/* ================================================================ Repeat last search*/static int next(){ untgetch('\n'); untgetch('/'); return (0);}/* ================================================================ Insert new text*/static int ins(){ register int i; register char sc; int rn, cn; rn = 5; cn = cp - lp + 6; tprintf("@m0060@SMode:@s INSERT @M", &rn, &cn); chgpos = cp; chglen = 0; chgcmd = 'i'; for (;;) { sc = tgetch(); if (sc == K_ESC || sc == K_BREAK || sc == K_CANCEL || sc == '\n') { if (chglen == MAXCHG) chglen = 0; if (cp) --cp; fldtxt[len] = '\0'; tprintf("@m0060@SMode:@s COMMAND"); return ((sc == K_ESC || sc == K_BREAK || sc == K_CANCEL) ? 0 : 1); } if (sc == '\b' && chglen) { for (i = --cp; i < len - 1; ++i) fldtxt[i] = fldtxt[i + 1]; --chglen; --len; } else if (sc >= ' ' && sc <= '~' && cp < MAXSZ) { for (i = len; i > cp; --i) fldtxt[i] = fldtxt[i - 1]; fldtxt[cp++] = sc; if (chglen < MAXCHG) chgbuf[chglen++] = sc; ++len; } else { if (task->ctbl_activ && task->country_tbl[(unsigned char) sc].out_chr && cp < MAXSZ) { for (i = len; i > cp; --i) fldtxt[i] = fldtxt[i - 1]; fldtxt[cp++] = sc; if (chglen < MAXCHG) chgbuf[chglen++] = sc; ++len; } } pr_text(); }}/* ================================================================ Append at next position*/static int apndnxt(){ register int i; if (len == 0) return (ins()); if (cp == len - 1) { /* add space to end */ fldtxt[len++] = ' '; fldtxt[len] = '\0'; } ++cp; pr_text(); i = ins(); if (cp == len - 2) { fldtxt[--len] = '\0'; refresh = 1; } return (i);}/* ================================================================ Append at end of text*/static int apndend(){ untgetch('a'); untgetch('$'); return (0);}/* ================================================================ Replace char*/static int repch(){ char rc; rc = tgetch(); chgbuf[0] = fldtxt[cp]; chglen = 1; chgpos = cp; chgcmd = 'r'; fldtxt[cp] = rc; tprintf("%c", &rc); return (0);}/* ================================================================ Replace text*/static int reptxt(){ register char rc; int rn, cn; rn = 5; cn = cp - lp + 6; tprintf("@m0060@SMode:@s REPLACE@M", &rn, &cn); chgpos = cp; chglen = 0; chgcmd = 'r'; for (;;) { rc = tgetch(); if (rc == K_ESC || rc == K_BREAK || rc == K_CANCEL || rc == '\n') { if (chglen == MAXCHG) chglen = 0; if (cp) --cp; tprintf("@m0060@SMode:@s COMMAND"); return ((rc == K_ESC || rc == K_BREAK || rc == K_CANCEL) ? 0 : 1); } if (rc == '\b' && chglen) { fldtxt[--cp] = chgbuf[--chglen]; } else if (rc >= ' ' && rc <= '~' && cp < len) { if (task->ctbl_activ && task->country_tbl[(unsigned char) sc].out_chr) if (chglen < MAXCHG) chgbuf[chglen++] = fldtxt[cp]; fldtxt[cp++] = rc; } else { if (task->ctbl_activ && task->country_tbl[(unsigned char) rc].out_chr && cp < len) { if (chglen < MAXCHG) chgbuf[chglen++] = fldtxt[cp]; fldtxt[cp++] = rc; } } pr_text(); }}/* ================================================================ Delete character under cursor (right)*/static int delr(){ register int i; if (rep > len - cp) rep = len - cp; if (len) { for (chglen = 0; chglen < rep && rep < MAXCHG; ++chglen) chgbuf[chglen] = fldtxt[cp + chglen]; chgbuf[chglen] = '\0'; chgcmd = 'x'; chgpos = cp; for (i = cp; i <= len - rep; ++i) fldtxt[i] = fldtxt[i + rep]; if (cp >= (len = len - rep)) { cp = len - 1; rp = cp; if ((lp = rp - DWIDTH + 1) < 0) lp = 0; } refresh = 1; } return (0);}/* ================================================================ Set delete mode*/static int setdel(){ dp = cp; deleting = 1; return (0);}/* ================================================================ Delete text between dp and cp*/static int delete(int cmd){ if (cp < dp) { rep = dp - cp; } else if (cp > dp) { rep = cp - dp; if (cmd >= THRUCMDS) ++rep; cp = dp; } else return (0); deleting = 0; return (delr());}/* ================================================================ Undo last change*/static int undo(){ register int i; register int rc; if (chglen) { switch (chgcmd) { case 'x': for (i = len + chglen; i >= chgpos + chglen; --i) fldtxt[i] = fldtxt[i - chglen]; for (i = 0; i < chglen; ++i) fldtxt[chgpos + i] = chgbuf[i]; len = len + chglen; rp = lp + DWIDTH - 1; if (rp > len - 1) rp = len - 1; cp = chgpos; chgcmd = 'i'; refresh = 1; break; case 'i': rep = chglen; cp = chgpos; delr(); break; case 'r': for (i = 0; i < chglen; ++i) { rc = fldtxt[chgpos + i]; fldtxt[chgpos + i] = chgbuf[i]; chgbuf[i] = (char) rc; } cp = chgpos; refresh = 1; break; } } return (0);}/* ================================================================ Print field text from specified column*/static int pr_text(){ register int i; int rn, cn; if (rp > len - 1) { rp = len - 1; if ((lp = rp - DWIDTH + 1) < 0) lp = 0; } if (len == 0) { cp = lp = rp = 0; } else if (len <= DWIDTH) { lp = 0; rp = len - 1; } else if (cp < lp) { lp = cp; rp = lp + DWIDTH - 1; } else if (cp > rp) { rp = (cp < len) ? cp : len - 1; lp = rp - DWIDTH + 1; } tprintf("@o"); if (lp) tprintf("@m0505@S<@s"); else tprintf("@m0505@S>@s"); for (i = lp; len && i <= rp; ++i) tprintf("%c", fldtxt + i); if (rp == 0 || rp == len - 1) tprintf("@S<@s@e"); else tprintf("@S>@s@e"); rn = 5; cn = cp - lp + 6; tprintf("@M@O", &rn, &cn); refresh = 0; return 0;}/* ================================================================ Beep for users attention*/void beep(){ putchar('\7');}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?