|
|
1.1 root 1: #ifndef lint
2: static char rcsid[] = "$Header: StringSrc.c,v 1.3 87/09/13 13:28:11 swick Exp $";
3: #endif lint
4:
5: /*
6: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
7: *
8: * All Rights Reserved
9: *
10: * Permission to use, copy, modify, and distribute this software and its
11: * documentation for any purpose and without fee is hereby granted,
12: * provided that the above copyright notice appear in all copies and that
13: * both that copyright notice and this permission notice appear in
14: * supporting documentation, and that the name of Digital Equipment
15: * Corporation not be used in advertising or publicity pertaining to
16: * distribution of the software without specific, written prior permission.
17: *
18: *
19: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
20: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
21: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
22: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
23: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
24: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
25: * SOFTWARE.
26: */
27: /* File: StringSource.c */
28:
29: #include <sys/types.h>
30: #include <sys/stat.h>
31: #include <sys/file.h>
32: #include "Xlib.h"
33: #include "Intrinsic.h"
34: #include "Atoms.h"
35: #include "Text.h"
36: #include "TextP.h"
37:
38: /* Private StringSource Definitions */
39:
40:
41: typedef struct _StringSourceData {
42: XtEditType editMode;
43: char *str;
44: XtTextPosition length, maxLength;
45: } StringSourceData, *StringSourcePtr;
46:
47: #define Increment(data, position, direction)\
48: {\
49: if (direction == XtsdLeft) {\
50: if (position > 0) \
51: position -= 1;\
52: }\
53: else {\
54: if (position < data->length)\
55: position += 1;\
56: }\
57: }
58:
59: static XtResource stringResources[] = {
60: {XtNstring, XtCString, XrmRString, sizeof (char *),
61: XtOffset(StringSourcePtr, str), XrmRString, NULL},
62: {XtNlength, XtCLength, XrmRInt, sizeof (int),
63: XtOffset(StringSourcePtr, length), XrmRString, "0"},
64: {XtNlength, XtCLength, XrmRInt, sizeof (int),
65: XtOffset(StringSourcePtr, maxLength), XrmRString, "100"},
66: {XtNeditType, XtCEditType, XtREditMode, sizeof(XtEditType),
67: XtOffset(StringSourcePtr, editMode), XrmRString, "read"},
68: };
69:
70: char Look(data, position, direction)
71: StringSourcePtr data;
72: XtTextPosition position;
73: ScanDirection direction;
74: {
75: /* Looking left at pos 0 or right at position data->length returns newline */
76: if (direction == XtsdLeft) {
77: if (position == 0)
78: return(0);
79: else
80: return(data->str[position-1]);
81: }
82: else {
83: if (position == data->length)
84: return(0);
85: else
86: return(data->str[position]);
87: }
88: }
89:
90: static int StringReadText (src, pos, text, maxRead)
91: XtTextSource *src;
92: int pos;
93: XtTextBlock *text;
94: int maxRead;
95: {
96: int charsLeft;
97: StringSourcePtr data;
98:
99: data = (StringSourcePtr) src->data;
100: text->firstPos = pos;
101: text->ptr = data->str + pos;
102: charsLeft = data->length - pos;
103: text->length = (maxRead > charsLeft) ? charsLeft : maxRead;
104: return pos + text->length;
105: }
106:
107: static int StringReplaceText (src, startPos, endPos, text, delta)
108: XtTextSource *src;
109: XtTextPosition startPos, endPos;
110: XtTextBlock *text;
111: int *delta;
112: {
113: StringSourcePtr data;
114: int i, length;
115:
116: data = (StringSourcePtr) src->data;
117: switch (data->editMode) {
118: case XttextAppend:
119: if (startPos != endPos || endPos!= data->length)
120: return (POSITIONERROR);
121: break;
122: case XttextRead:
123: return (EDITERROR);
124: case XttextEdit:
125: break;
126: default:
127: return (EDITERROR);
128: }
129: length = endPos - startPos;
130: *delta = text->length - length;
131: if (*delta < 0) /* insert shorter than delete, text getting
132: shorter */
133: for (i = startPos; i < data->length + *delta; ++i)
134: data->str[i] = data->str[i - *delta];
135: else
136: if (*delta > 0) { /* insert longer than delete, text getting
137: longer */
138: for (i = data->length; i > startPos-1; --i)
139: data->str[i + *delta] = data->str[i];
140: }
141: if (text->length != 0) /* do insert */
142: for (i = 0; i < text->length; ++i)
143: data->str[startPos + i] = text->ptr[i];
144: data->length = data->length + *delta;
145: data->str[data->length] = 0;
146: return (EDITDONE);
147: }
148:
149: static StringSetLastPos (src, lastPos)
150: XtTextSource *src;
151: XtTextPosition lastPos;
152: {
153: ((StringSourceData *) (src->data))->length = lastPos;
154: }
155:
156: static XtTextPosition StringScan (src, pos, sType, dir, count, include)
157: XtTextSource *src;
158: XtTextPosition pos;
159: ScanType sType;
160: ScanDirection dir;
161: int count;
162: Boolean include;
163: {
164: StringSourcePtr data;
165: XtTextPosition position;
166: int i, whiteSpace;
167: char c;
168: int ddir = (dir == XtsdRight) ? 1 : -1;
169:
170: data = (StringSourcePtr) src->data;
171: position = pos;
172: switch (sType) {
173: case XtstPositions:
174: if (!include && count > 0)
175: count -= 1;
176: for (i = 0; i < count; i++) {
177: Increment(data, position, dir);
178: }
179: break;
180: case XtstWhiteSpace:
181:
182: for (i = 0; i < count; i++) {
183: whiteSpace = -1;
184: while (position >= 0 && position <= data->length) {
185: c = Look(data, position, dir);
186: if ((c == ' ') || (c == '\t') || (c == '\n')){
187: if (whiteSpace < 0) whiteSpace = position;
188: } else if (whiteSpace >= 0)
189: break;
190: position += ddir;
191: }
192: }
193: if (!include) {
194: if(whiteSpace < 0 && dir == XtsdRight) whiteSpace = data->length;
195: position = whiteSpace;
196: }
197: break;
198: case XtstEOL:
199: for (i = 0; i < count; i++) {
200: while (position >= 0 && position <= data->length) {
201: if (Look(data, position, dir) == '\n')
202: break;
203: if(((dir == XtsdRight) && (position == data->length)) ||
204: (dir == XtsdLeft) && ((position == 0)))
205: break;
206: Increment(data, position, dir);
207: }
208: if (i + 1 != count)
209: Increment(data, position, dir);
210: }
211: if (include) {
212: /* later!!!check for last char in file # eol */
213: Increment(data, position, dir);
214: }
215: break;
216: case XtstFile:
217: if (dir == XtsdLeft)
218: position = 0;
219: else
220: position = data->length;
221: }
222: if (position < 0) position = 0;
223: if (position > data->length) position = data->length;
224: return(position);
225: }
226:
227: static XtEditType StringGetEditType(src)
228: XtTextSource *src;
229: {
230: StringSourcePtr data;
231: data = (StringSourcePtr) src->data;
232: return(data->editMode);
233: }
234:
235: /***** Public routines *****/
236:
237: int *XtStringSourceCreate (w, args, argCount)
238: Widget w;
239: ArgList args;
240: int argCount;
241: {
242: XtTextSource *src;
243: StringSourcePtr data;
244:
245: src = (XtTextSource *) XtMalloc(sizeof(XtTextSource));
246: src->read = StringReadText;
247: src->replace = StringReplaceText;
248: src->setLastPos = StringSetLastPos;
249: src->scan = StringScan;
250: src->editType = StringGetEditType;
251: src->data = (int *) (XtMalloc(sizeof(StringSourceData)));
252: data = (StringSourcePtr) src->data;
253:
254: /* XXX name and class??? */
255: XtGetSubresources (XtDisplay(w), data, "subclass", "subclass",
256: stringResources, XtNumber(stringResources), args, argCount);
257:
258: if (data->str == NULL) {
259: data->str = (char *) XtMalloc (data->maxLength);
260: data->length = 0;
261: }
262: src->data = (int *) (data);
263: return(int *) src;
264: }
265:
266: void XtStringSourceDestroy (src)
267: XtTextSource *src;
268: {
269: XtFree((char *) src->data);
270: XtFree((char *) src);
271: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.