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 + -
显示快捷键?