|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ S T ┃
Length: 7043 (0x1b83) Types: TextFile Names: »StringSource.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/Toolkit/DECToolkit/src/StringSource.c«
/* * $Source: /u1/X/DECToolkit/src/RCS/StringSource.c,v $ * $Header: StringSource.c,v 1.1 86/12/17 09:02:48 swick Exp $ */ #ifndef lint static char *rcsid_StringSource_c = "$Header: StringSource.c,v 1.1 86/12/17 09:02:48 swick Exp $"; #endif lint #ifndef lint static char *sccsid = "@(#)StringSource.c 1.6 12/11/86"; #endif lint /* * COPYRIGHT 1986 * DIGITAL EQUIPMENT CORPORATION * MAYNARD, MASSACHUSETTS * ALL RIGHTS RESERVED. * * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR * ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. * * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS, * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT * SET FORTH ABOVE. * * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting documentation, * and that the name of Digital Equipment Corporation not be used in advertising * or publicity pertaining to distribution of the software without specific, * written prior permission. */ /* File: StringSource.c */ #include <X/Xlib.h> #include <strings.h> #include "Toolkit.h" /** included in all toolkit files **/ #include "TextDisplay.h" /** included in all text subwindow files **/ /* Private StringSource Definitions */ typedef struct _StringSourceData { char *str; /** pointer to buffer in memory with source **/ TTextPosition length, /** length of stuff in buffer **/ maxLength; /** max length of buffer **/ } StringSourceData, *StringSourcePtr; #define Increment(data, position, direction)\ {\ if (direction == left) {\ if (position > 0) \ position -= 1;\ }\ else {\ if (position < data->length)\ position += 1;\ }\ } static char Look(data, position, direction) StringSourcePtr data; TTextPosition position; enum ScanDirection direction; { /* Looking left at pos 0 or right at position data->length returns newline */ if (direction == left) { if (position == 0) return('\n'); else return(data->str[position-1]); } else { if (position == data->length) return('\n'); else return(data->str[position]); } } /*** *** this routine will read source into "text", starting at "pos", for *** "maxRead" characters or end. *** NOTE: since this is a string source, no actually reading takes place *** because the source is already all in memory. ***/ static int StringReadText (src, pos, text, maxRead) TTextSource *src; int pos; /* starting position */ TTextBlock *text; /* RETURNED: text read in */ int maxRead; { int charsLeft; StringSourcePtr data; data = (StringSourcePtr) src->data; text->ptr = data->str + pos; charsLeft = data->length - pos; text->length = (maxRead > charsLeft) ? charsLeft : maxRead; return pos + text->length; } /*** *** Given a starting and ending position, this routine will replace the *** source text with "text". Depending on the startPos and endPos, the *** text may be inserted instead of replaced. ***/ static int StringReplaceText (src, startPos, endPos, text) TTextSource *src; TTextPosition startPos, endPos; TTextBlock *text; { StringSourcePtr data; int i, delta, length; length = endPos - startPos; data = (StringSourcePtr) src->data; if (text->length < 0) /* delete key was hit */ delta = -1; else /* any other key was hit */ delta = text->length - length; if (delta < 0) /* insert shorter than delete, text getting shorter */ for (i = startPos; i < data->length + delta; ++i) data->str[i] = data->str[i - delta]; else if (delta > 0) /* insert longer than delete, text getting longer */ for (i = data->length; i >= startPos + delta - 1; --i) data->str[i + delta] = data->str[i]; /** do the insert **/ if (text->length > 0) for (i = 0; i < text->length; ++i) data->str[startPos + i] = text->ptr[i]; data->length = data->length + delta; return delta; } /*** *** function to get length of source. ***/ static TTextPosition StringGetLastPos (src) TTextSource *src; { return(((StringSourceData *) (src->data))->length); } /*** *** fuction to change lenght of source. ***/ static StringSetLastPos (src, lastPos) TTextSource *src; TTextPosition lastPos; { ((StringSourceData *) (src->data))->length = lastPos; } /*** *** what time of text insertion is allowed for this source. ***/ static enum InsertionType StringEditType() { return(edit); } /*** *** This routine will start at *** the "pos" position of the source and scan in the appropriate *** direction until it finds something of the right sType. It returns *** the new position. ***/ static TTextPosition StringScan (src, pos, sType, dir, word_break_symbols) TTextSource *src; TTextPosition pos; enum SelectionType sType; enum ScanDirection dir; char *word_break_symbols; { StringSourcePtr data; TTextPosition position; int whiteSpace; char c; data = (StringSourcePtr) src->data; position = pos; switch (sType) { case charSelection: Increment(data, position, dir); break; case wordSelection: whiteSpace = 0; while (position > 0 && position < data->length) { c = Look(data, position, dir); whiteSpace = (c == ' ') || (c == '\t') || (c == '\n'); if (whiteSpace) break; else if (index(word_break_symbols, c) != 0) break; Increment(data, position, dir); } break; case lineSelection: while (position > 0 && position < data->length) { if (Look(data, position, dir) == '\n') break; Increment(data, position, dir); } break; case allSelection: if (dir == left) position = 0; else position = data->length; } return(position); } /* Public routines */ int *TCreateStringSource (str, maxLength) char *str; int maxLength; { TTextSource *src; StringSourcePtr data; int i; src = (TTextSource *) Tmalloc(sizeof(TTextSource)); src->read = StringReadText; src->replace = StringReplaceText; src->getLastPos = StringGetLastPos; src->setLastPos = StringSetLastPos; src->getEditType = StringEditType; src->scan = StringScan; src->data = (int *) (Tmalloc(sizeof(StringSourceData))); data = (StringSourcePtr) src->data; i = 0; while (str[i] != 0) ++i; data->str = str; data->length = i; data->maxLength = maxLength; src->data = (int *) (data); return(int *) src; } void TDestroyStringSource (src) TTextSource *src; { free(src->data); free(src); }