Annotation of researchv9/X11/src/X.V11R1/clients/xmh/tsource.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char rcs_id[] = "$Header: tsource.c,v 1.10 87/09/11 08:18:42 toddb Exp $";
                      3: #endif lint
                      4: /*
                      5:  *                       COPYRIGHT 1987
                      6:  *                DIGITAL EQUIPMENT CORPORATION
                      7:  *                    MAYNARD, MASSACHUSETTS
                      8:  *                     ALL RIGHTS RESERVED.
                      9:  *
                     10:  * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
                     11:  * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
                     12:  * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR
                     13:  * ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
                     14:  *
                     15:  * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS,
                     16:  * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT
                     17:  * SET FORTH ABOVE.
                     18:  *
                     19:  *
                     20:  * Permission to use, copy, modify, and distribute this software and its
                     21:  * documentation for any purpose and without fee is hereby granted, provided
                     22:  * that the above copyright notice appear in all copies and that both that
                     23:  * copyright notice and this permission notice appear in supporting documentation,
                     24:  * and that the name of Digital Equipment Corporation not be used in advertising
                     25:  * or publicity pertaining to distribution of the software without specific,
                     26:  * written prior permission.
                     27:  */
                     28: 
                     29: /* File: tsource.c -- the code for a toc source */
                     30: 
                     31: #include "xmh.h"
                     32: #include "tocintrnl.h"
                     33: 
                     34: /* Private definitions. */
                     35: 
                     36: #define BUFSIZE        512
                     37: 
                     38: Msg MsgFromPosition(toc, position, dir)
                     39:   Toc toc;
                     40:   XtTextPosition position;
                     41:   ScanDirection dir;
                     42: {
                     43:     Msg msg;
                     44:     int     h, l, m;
                     45:     if (dir == XtsdLeft) position--;
                     46:     l = 0;
                     47:     h = toc->nummsgs - 1;
                     48:     while (l < h - 1) {
                     49:        m = (l + h) / 2;
                     50:        if (toc->msgs[m]->position > position)
                     51:            h = m;
                     52:        else
                     53:            l = m;
                     54:     }
                     55:     msg = toc->msgs[h];
                     56:     if (msg->position > position)
                     57:        msg = toc->msgs[h = l];
                     58:     while (!msg->visible)
                     59:        msg = toc->msgs[h++];
                     60:     if (position < msg->position || position > msg->position + msg->length)
                     61:        Punt("Error in MsgFromPosition!");
                     62:     return msg;
                     63: }
                     64: 
                     65: 
                     66: static XtTextPosition CoerceToLegalPosition(toc, position)
                     67:   Toc toc;
                     68:   XtTextPosition position;
                     69: {
                     70:     return (position < 0) ? 0 :
                     71:                 ((position > toc->lastPos) ? toc->lastPos : position);
                     72: }
                     73: 
                     74: 
                     75: /* Semi-public definitions */
                     76: 
                     77: static TSourceReadText(src, position, text, maxRead)
                     78:   XtTextSource *src;
                     79:   XtTextPosition position;
                     80:   XtTextBlock *text;
                     81:   int maxRead;
                     82: {
                     83:     Toc toc = (Toc) src->data;
                     84:     Msg msg;
                     85:     int count;
                     86:     text->firstPos = position;
                     87:     if (position < toc->lastPos) {
                     88:        msg = MsgFromPosition(toc, position, XtsdRight);
                     89:        text->ptr = msg->buf + (position - msg->position);
                     90:        count = msg->length - (position - msg->position);
                     91:        text->length = (count < maxRead) ? count : maxRead;
                     92:        position += text->length;
                     93:     }
                     94:     else {
                     95:        text->length = 0;
                     96:        text->ptr = "";
                     97:     }
                     98:     return position;
                     99: }
                    100: 
                    101: 
                    102: /* Right now, we can only replace a piece with another piece of the same size,
                    103:    and it can't cross between lines. */
                    104: 
                    105: static int TSourceReplaceText(src, startPos, endPos, text, delta)
                    106:   XtTextSource *src;
                    107:   XtTextPosition startPos, endPos;
                    108:   XtTextBlock *text;
                    109:   int *delta;
                    110: {
                    111:     Toc toc = (Toc) src->data;
                    112:     Msg msg;
                    113:     int i;
                    114:     *delta = text->length - (endPos - startPos);
                    115:     if (*delta != 0)
                    116:        return EDITERROR;
                    117:     msg = MsgFromPosition(toc, startPos, XtsdRight);
                    118:     for (i = 0; i < text->length; i++)
                    119:        msg->buf[startPos - msg->position + i] = text->ptr[i];
                    120:     return EDITDONE;
                    121: }
                    122: 
                    123: 
                    124: static XtTextPosition TSourceGetLastPos(src)
                    125:   XtTextSource *src;
                    126: {
                    127:     return ((Toc) src->data)->lastPos;
                    128: }
                    129: 
                    130: 
                    131: /*ARGSUSED*/   /* -- keeps lint from complaining. */
                    132: static TSourceSetLastPos(src)
                    133:   XtTextSource *src;
                    134: {
                    135: }
                    136: 
                    137: 
                    138: #define Look(index, c)\
                    139: {                                                                      \
                    140:     if ((dir == XtsdLeft && index <= 0) ||                             \
                    141:            (dir == XtsdRight && index >= toc->lastPos))                        \
                    142:        c = 0;                                                          \
                    143:     else {                                                             \
                    144:        if (index + doff < msg->position ||                             \
                    145:                index + doff >= msg->position + msg->length)            \
                    146:            msg = MsgFromPosition(toc, index, dir);                     \
                    147:        c = msg->buf[index + doff - msg->position];                     \
                    148:     }                                                                  \
                    149: }
                    150: 
                    151: 
                    152: 
                    153: static XtTextPosition TSourceScan(src, position, sType, dir, count, include)
                    154:   XtTextSource *src;
                    155:   XtTextPosition position;
                    156:   ScanType sType;
                    157:   ScanDirection dir;
                    158:   int count, include;
                    159: {
                    160:     Toc toc = (Toc) src->data;
                    161:     XtTextPosition index;
                    162:     Msg msg;
                    163:     char    c;
                    164:     int     ddir, doff, i, whiteSpace;
                    165:     ddir = (dir == XtsdRight) ? 1 : -1;
                    166:     doff = (dir == XtsdRight) ? 0 : -1;
                    167: 
                    168:     if (toc->lastPos == 0) return 0;
                    169:     index = position;
                    170:     if (index + doff < 0) return 0;
                    171:     if (dir == XtsdRight && index >= toc->lastPos) return toc->lastPos;
                    172:     msg = MsgFromPosition(toc, index, dir);
                    173:     switch (sType) {
                    174:        case XtstPositions:
                    175:            if (!include && count > 0)
                    176:                count--;
                    177:            index = CoerceToLegalPosition(toc, index + count * ddir);
                    178:            break;
                    179:        case XtstWhiteSpace:
                    180:            for (i = 0; i < count; i++) {
                    181:                whiteSpace = -1;
                    182:                while (index >= 0 && index <= toc->lastPos) {
                    183:                    Look(index, c);
                    184:                    if ((c == ' ') || (c == '\t') || (c == '\n')) {
                    185:                        if (whiteSpace < 0) whiteSpace = index;
                    186:                    } else if (whiteSpace >= 0)
                    187:                        break;
                    188:                    index += ddir;
                    189:                }
                    190:            }
                    191:            if (!include) {
                    192:                if (whiteSpace < 0 && dir == XtsdRight)
                    193:                    whiteSpace = toc->lastPos;
                    194:                index = whiteSpace;
                    195:            }
                    196:            index = CoerceToLegalPosition(toc, index);
                    197:            break;
                    198:        case XtstEOL:
                    199:            for (i = 0; i < count; i++) {
                    200:                while (index >= 0 && index <= toc->lastPos) {
                    201:                    Look(index, c);
                    202:                    if (c == '\n')
                    203:                        break;
                    204:                    index += ddir;
                    205:                }
                    206:                if (i < count - 1)
                    207:                    index += ddir;
                    208:            }
                    209:            if (include)
                    210:                index += ddir;
                    211:            index = CoerceToLegalPosition(toc, index);
                    212:            break;
                    213:        case XtstFile:
                    214:            if (dir == XtsdLeft)
                    215:                index = 0;
                    216:            else
                    217:                index = toc->lastPos;
                    218:            break;
                    219:     }
                    220:     return index;
                    221: }
                    222: 
                    223: 
                    224: /*ARGSUSED*/   /* -- keeps lint from complaining. */
                    225: static XtEditType TSourceGetEditType(src)
                    226: XtTextSource *src;
                    227: {
                    228:     return XttextRead;
                    229: }
                    230: 
                    231: /* Public definitions. */
                    232: 
                    233: XtTextSource *TSourceCreate(toc)
                    234:   Toc toc;
                    235: {
                    236:     XtTextSource *src;
                    237:     src = (XtTextSource *) XtMalloc(sizeof(XtTextSource));
                    238:     src->read = TSourceReadText;
                    239:     src->replace = TSourceReplaceText;
                    240:     src->getLastPos = TSourceGetLastPos;
                    241:     src->setLastPos = TSourceSetLastPos;
                    242:     src->editType = TSourceGetEditType;
                    243:     src->scan = TSourceScan;
                    244:     src->data = (int *) toc;
                    245:     return src;
                    246: }

unix.superglobalmegacorp.com

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