Annotation of coherent/g/usr/bin/me/word.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * The routines in this file
                      3:  * implement commands that work word at
                      4:  * a time. There are all sorts of word mode
                      5:  * commands. If I do any sentence and/or paragraph
                      6:  * mode commands, they are likely to be put in
                      7:  * this file.
                      8:  */
                      9: #include       <stdio.h>
                     10: #if NORMAL_CHARS
                     11: #include <ctype.h>
                     12: #endif
                     13: #include       "ed.h"
                     14: 
                     15: /*
                     16:  * Word wrap on input.
                     17:  * called when data is typed in checks that we are at an 
                     18:  * end of line. And then trys to wrap the line.
                     19:  */
                     20: void
                     21: wrapword()
                     22: {
                     23:        register LINE *clp;
                     24:        
                     25:        if (llength(clp = curwp->w_dotp) == curwp->w_doto)
                     26:                wrapblock(clp, 0, llength(clp), 0);
                     27: }
                     28: 
                     29: /*
                     30:  * Refill region between mark and cursor.
                     31:  */
                     32: fillregion(f, n)
                     33: {
                     34:        REGION          region;
                     35: 
                     36:        if (getregion(&region) != TRUE)
                     37:                return (FALSE);
                     38: 
                     39:        if (!bind.fillcol) {
                     40:                mlwrite("Use <ctl-x> f to set fill collumn first");
                     41:                return (FALSE);
                     42:        }
                     43:        return (wrapblock(region.r_linep, region.r_offset, region.r_size,
                     44:                                                  truecol(region.r_linep, region.r_offset)));
                     45: }
                     46: 
                     47: /*
                     48:  * wrap a block of data. Gets the start address, size and
                     49:  * true collum of the start. Triggers when printable chars
                     50:  * are over wrap length and there is white space before them.
                     51:  */
                     52: wrapblock(lineP, offset, size, trueCol)
                     53: register LINE *lineP;
                     54: short offset, size, trueCol;
                     55: {
                     56:        int blackCt, whiteCt;
                     57: 
                     58:        for (blackCt = whiteCt = 0; size-- > 0; offset++) {
                     59:                if (offset == llength(lineP)) {
                     60:                        if (!size)
                     61:                                break;
                     62:                        whiteCt = blackCt = 0;
                     63:                        while (!llength(lineP = lforw(lineP))) {
                     64:                                size--;
                     65:                                trueCol = 0;
                     66:                                offset = -1;
                     67:                        }
                     68:                        if (-1 == offset)
                     69:                                continue;
                     70:                        curwp->w_doto = offset;
                     71:                        curwp->w_dotp = lineP = lback(lineP);
                     72:                        ldelete(1, FALSE);
                     73:                        linsert(whiteCt = 1, ' ');
                     74:                        trueCol++;
                     75:                        offset = curwp->w_doto - 1;
                     76:                        lineP = curwp->w_dotp;
                     77:                        continue;
                     78:                }
                     79:                switch (lgetc(lineP, offset)) {
                     80:                case '\t':
                     81:                        taber(trueCol);
                     82:                case ' ':
                     83:                        if (!blackCt)
                     84:                                whiteCt++;
                     85:                        else {
                     86:                                whiteCt = 1;
                     87:                                blackCt = 0;
                     88:                        }
                     89:                        break;
                     90:                default:
                     91:                        if (!blackCt)
                     92:                                blackCt = 1;
                     93:                        else
                     94:                                blackCt++;
                     95:                }
                     96:                if ((trueCol++ > bind.fillcol) && whiteCt && blackCt) {
                     97:                        curwp->w_dotp = lineP;
                     98:                        curwp->w_doto = offset -= whiteCt + blackCt - 1;
                     99:                        lnewline();
                    100:                        ldelete(whiteCt, FALSE);
                    101:                        whiteCt = 0;
                    102:                        offset = (trueCol = blackCt) - 1;
                    103:                        lineP = curwp->w_dotp;
                    104:                }
                    105:        }
                    106:        curwp->w_doto  = llength(curwp->w_dotp);
                    107:        return (TRUE);
                    108: }
                    109: 
                    110: /*
                    111:  * Return TRUE if the character at dot is a character that is considered
                    112:  * to be white space. Used in wordwrap.
                    113:  * The whitespace character list is hard coded. Should be setable.
                    114:  */
                    115: inwhite()
                    116: {
                    117:        register int    c;
                    118: 
                    119:        if (curwp->w_doto == llength(curwp->w_dotp))
                    120:                return (FALSE);
                    121:        c = lgetc(curwp->w_dotp, curwp->w_doto);
                    122:        if (c == ' ' || c == '\t' )
                    123:                return (TRUE);
                    124:        return (FALSE);
                    125: }
                    126: 
                    127: /*
                    128:  * Move the cursor backward to the last bit of whitespace...
                    129:  * All of the details of motion are performed by the "backchar" and "forwchar"
                    130:  * routines. Error if you try to move beyond the buffers.
                    131:  */
                    132: backwhite()
                    133: {
                    134:        if (backchar(FALSE, 1) == FALSE)
                    135:                return (FALSE);
                    136:        while (!inwhite()) {
                    137:                if (backchar(FALSE, 1) == FALSE)
                    138:                        return (FALSE);
                    139:        }
                    140:        return (forwchar(FALSE, 1));
                    141: }
                    142: 
                    143: /*
                    144:  * Move the cursor backward by "n" words.  All of the details of motion
                    145:  * are performed by the "backchar" and "forwchar" routines.  Error if you
                    146:  * try to move beyond the buffers.
                    147:  */
                    148: backword(f, n)
                    149: {
                    150:        if (n < 0)
                    151:                return (forwword(f, -n));
                    152:        if (backchar(FALSE, 1) == FALSE)
                    153:                return (FALSE);
                    154:        while (n--) {
                    155:                while (inword() == FALSE) {
                    156:                        if (backchar(FALSE, 1) == FALSE)
                    157:                                return (FALSE);
                    158:                }
                    159:                while (inword() != FALSE) {
                    160:                        if (backchar(FALSE, 1) == FALSE)
                    161:                                return (FALSE);
                    162:                }
                    163:        }
                    164:        return (forwchar(FALSE, 1));
                    165: }
                    166: 
                    167: /*
                    168:  * Move the cursor forward by the specified number of words.  All of the
                    169:  * motion is done by "forwchar".  Error if you try and move beyond the
                    170:  * buffer's end.
                    171:  */
                    172: forwword(f, n)
                    173: {
                    174:        if (n < 0)
                    175:                return (backword(f, -n));
                    176:        while (n--) {
                    177:                while (inword() == FALSE) {
                    178:                        if (forwchar(FALSE, 1) == FALSE)
                    179:                                return (FALSE);
                    180:                }
                    181:                while (inword() != FALSE) {
                    182:                        if (forwchar(FALSE, 1) == FALSE)
                    183:                                return (FALSE);
                    184:                }
                    185:        }
                    186:        return (TRUE);
                    187: }
                    188: 
                    189: /*
                    190:  * There is no pattern I can discover to the upper and lower case
                    191:  * of the wierd umlauts etc tacked on to ascii. These tables are the
                    192:  * convertable wierd characters upFor has the upper case and loFor
                    193:  * the corresponding lower case.
                    194:  */
                    195: static uchar upFor[8] = { 0x80, 0x9A, 0x90, 0x8E, 0x8F, 0x92, 0x99, 0 };
                    196: static uchar loFor[8] = { 0x87, 0x81, 0x82, 0x84, 0x86, 0x91, 0x94, 0 };
                    197: 
                    198: /*
                    199:  * Turn a char to upper case.
                    200:  */
                    201: capChar()
                    202: {
                    203:        register int c;
                    204: 
                    205:        if (c = islow(lgetc(curwp->w_dotp, curwp->w_doto))) {
                    206:                lputc(curwp->w_dotp, curwp->w_doto, c);
                    207:                lchange(WFHARD);
                    208:        }
                    209:        return (forwchar(FALSE, 1));
                    210: }
                    211: 
                    212: /*
                    213:  * If character is lower case return upper case version.
                    214:  * else return 0
                    215:  */
                    216: islow(c)
                    217: register int c;
                    218: {
                    219: #if NORMAL_CHARS
                    220:        return (islower(c) ? toupper(c) : 0);
                    221: #else
                    222:        int i, d;
                    223: 
                    224:        if (c>='a' && c<='z')
                    225:                return (c - ('a'-'A'));
                    226: 
                    227:        if (c & 0x80)
                    228:                for (i = 0; d = loFor[i]; i++)
                    229:                        if (d == c)
                    230:                                return (upFor[i]);
                    231:        return (0);
                    232: #endif
                    233: }
                    234: 
                    235: /*
                    236:  * Turn a char to lower case.
                    237:  */
                    238: lowChar()
                    239: {
                    240:        register int c;
                    241: 
                    242:        if (c = ishi(lgetc(curwp->w_dotp, curwp->w_doto))) {
                    243:                lputc(curwp->w_dotp, curwp->w_doto, c);
                    244:                lchange(WFHARD);
                    245:        }
                    246:        return (forwchar(FALSE, 1));
                    247: }
                    248: 
                    249: /*
                    250:  * If character is upper case return lower case version.
                    251:  * else return 0
                    252:  */
                    253: ishi(c)
                    254: register int c;
                    255: {
                    256: #if NORMAL_CHARS
                    257:        return (isupper(c) ? tolower(c) : 0);
                    258: #else
                    259:        int i, d;
                    260: 
                    261:        if (c>='A' && c<='Z')
                    262:                return (c - ('A'-'a'));
                    263: 
                    264:        if (c & 0x80)
                    265:                for (i = 0; d = upFor[i]; i++)
                    266:                        if (d == c)
                    267:                                return (loFor[i]);
                    268:        return (0);
                    269: #endif
                    270: }
                    271: 
                    272: /*
                    273:  * Move the cursor forward by the specified number of words.  As you move,
                    274:  * convert any characters to upper case.  Error if you try and move beyond
                    275:  * the end of the buffer.
                    276:  * Bound to "M-U".
                    277:  */
                    278: upperword(f, n)
                    279: {
                    280:        if (n < 0)
                    281:                return (FALSE);
                    282:        while (n--) {
                    283:                while (inword() == FALSE)
                    284:                        if (forwchar(FALSE, 1) == FALSE)
                    285:                                return (FALSE);
                    286: 
                    287:                while (inword() != FALSE)
                    288:                        if (capChar() == FALSE)
                    289:                                return (FALSE);
                    290:        }
                    291:        return (TRUE);
                    292: }
                    293: 
                    294: /*
                    295:  * Move the cursor forward by the specified number of words.  As you move
                    296:  * convert characters to lower case.  Error if you try and move over the
                    297:  * end of the buffer.
                    298:  * Bound to "M-L".
                    299:  */
                    300: lowerword(f, n)
                    301: {
                    302:        register int    c;
                    303: 
                    304:        if (n < 0)
                    305:                return (FALSE);
                    306:        while (n--) {
                    307:                while (inword() == FALSE)
                    308:                        if (forwchar(FALSE, 1) == FALSE)
                    309:                                return (FALSE);
                    310: 
                    311:                while (inword() != FALSE)
                    312:                        if (lowChar() == FALSE)
                    313:                                return (FALSE);
                    314:        }
                    315:        return (TRUE);
                    316: }
                    317: 
                    318: /*
                    319:  * Move the cursor forward by
                    320:  * the specified number of words. As you move
                    321:  * convert the first character of the word to upper
                    322:  * case, and subsequent characters to lower case. Error
                    323:  * if you try and move past the end of the buffer.
                    324:  * Bound to "M-C".
                    325:  */
                    326: capword(f, n)
                    327: {
                    328:        register int    c;
                    329: 
                    330:        if (n < 0)
                    331:                return (FALSE);
                    332:        while (n--) {
                    333:                while (inword() == FALSE)
                    334:                        if (forwchar(FALSE, 1) == FALSE)
                    335:                                return (FALSE);
                    336: 
                    337:                if (inword() != FALSE) {
                    338:                        if (capChar() == FALSE)
                    339:                                return (FALSE);
                    340:                        while (inword() != FALSE)
                    341:                                if (lowChar() == FALSE)
                    342:                                        return (FALSE);
                    343:                }
                    344:        }
                    345:        return (TRUE);
                    346: }
                    347: 
                    348: /*
                    349:  * Kill forward by "n" words.
                    350:  * Remember the location of dot. Move forward
                    351:  * by the right number of words. Put dot back where
                    352:  * it was and issue the kill command for the
                    353:  * right number of characters. Bound to "M-D".
                    354:  */
                    355: delfword(f, n)
                    356: {
                    357:        register int    size;
                    358:        register LINE   *dotp;
                    359:        register int    doto;
                    360: 
                    361:        if (n < 0)
                    362:                return (FALSE);
                    363:        dotp = curwp->w_dotp;
                    364:        doto = curwp->w_doto;
                    365:        size = 0;
                    366:        if ((lastflag&CFKILL) == 0)             /* Clear kill buffer if */
                    367:                kdelete();                      /* last wasn't a kill.  */
                    368:        thisflag |= CFKILL;
                    369:        while (n--) {
                    370:                while (inword() == FALSE) {
                    371:                        if (forwchar(FALSE, 1) == FALSE)
                    372:                                return (FALSE);
                    373:                        ++size;
                    374:                }
                    375:                while (inword() != FALSE) {
                    376:                        if (forwchar(FALSE, 1) == FALSE)
                    377:                                return (FALSE);
                    378:                        ++size;
                    379:                }
                    380:        }
                    381:        curwp->w_dotp = dotp;
                    382:        curwp->w_doto = doto;
                    383:        return (ldelete(size, TRUE));
                    384: }
                    385: 
                    386: /*
                    387:  * Kill backwards by "n" words.
                    388:  * Move backwards by the desired number of
                    389:  * words, counting the characters. When dot is
                    390:  * finally moved to its resting place, fire off
                    391:  * the kill command. Bound to "M-Rubout" and
                    392:  * to "M-Backspace".
                    393:  */
                    394: delbword(f, n)
                    395: {
                    396:        register int    size;
                    397: 
                    398:        if (n < 0)
                    399:                return (FALSE);
                    400:        if (backchar(FALSE, 1) == FALSE)
                    401:                return (FALSE);
                    402:        size = 0;
                    403:        if ((lastflag&CFKILL) == 0)             /* Clear kill buffer if */
                    404:                kdelete();                      /* last wasn't a kill.  */
                    405:        thisflag |= CFKILL;
                    406:        while (n--) {
                    407:                while (inword() == FALSE) {
                    408:                        if (backchar(FALSE, 1) == FALSE)
                    409:                                return (FALSE);
                    410:                        ++size;
                    411:                }
                    412:                while (inword() != FALSE) {
                    413:                        if (backchar(FALSE, 1) == FALSE)
                    414:                                return (FALSE);
                    415:                        ++size;
                    416:                }
                    417:        }
                    418:        if (forwchar(FALSE, 1) == FALSE)
                    419:                return (FALSE);
                    420:        return (ldelete(size, TRUE));
                    421: }
                    422: 
                    423: /*
                    424:  * Return TRUE if the character at dot
                    425:  * is a character that is considered to be
                    426:  * part of a word. The word character list is hard
                    427:  * coded. Should be setable.
                    428:  */
                    429: inword()
                    430: {
                    431:        register int    c;
                    432: 
                    433:        if (curwp->w_doto == llength(curwp->w_dotp))
                    434:                return (FALSE);
                    435:        c = lgetc(curwp->w_dotp, curwp->w_doto);
                    436:        if (c>='a' && c<='z')
                    437:                return (TRUE);
                    438:        if (c>='A' && c<='Z')
                    439:                return (TRUE);
                    440:        if (c>='0' && c<='9')
                    441:                return (TRUE);
                    442:        if (c=='$' || c=='_' || c=='\\')        /* For identifiers */
                    443:                return (TRUE);
                    444:        if (c & 0x80)
                    445:                return (TRUE);
                    446:        return (FALSE);
                    447: }
                    448: 
                    449: #if    LIBHELP
                    450: /*
                    451:  * Lookup the current word.
                    452:  * Error if you try and move past the end of the buffer.
                    453:  * Bound to "M-M-".  Count is passed to lookup routine.
                    454:  */
                    455: lookupword(f, n)
                    456: {
                    457:        static uchar wordplace[128];
                    458:        register uchar *cp;
                    459: 
                    460:        while (inword() != FALSE)               /* Get to beginning of word */
                    461:                if (backchar(FALSE, 1) == FALSE)
                    462:                        break;
                    463: 
                    464:        while (inword() == FALSE) {             /* Advance to next word */
                    465:                if (forwchar(FALSE, 1) == FALSE)
                    466:                        return (FALSE);
                    467:        }
                    468: 
                    469:        cp = wordplace;
                    470:        while (inword() != FALSE) {
                    471:                *cp++ = lgetc(curwp->w_dotp, curwp->w_doto);
                    472:                if (forwchar(FALSE, 1) == FALSE)
                    473:                        break;
                    474:        }
                    475:        *cp = '\0';
                    476:        return do_lookup(wordplace, f, n);
                    477: }
                    478: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.