View | Details | Raw Unified | Return to bug 210344 | Differences between
and this patch

Collapse All | Expand All

(-)ul.c (-102 / +124 lines)
Lines 78-84 Link Here
78
	int	c_width;	/* width or -1 if multi-column char. filler */
78
	int	c_width;	/* width or -1 if multi-column char. filler */
79
} ;
79
} ;
80
80
81
static struct	CHAR	obuf[MAXBUF];
81
static struct	CHAR	sobuf[MAXBUF]; // static output buffer
82
static struct	CHAR	*obuf = sobuf;
83
static int	buflen = MAXBUF;
82
static int	col, maxcol;
84
static int	col, maxcol;
83
static int	mode;
85
static int	mode;
84
static int	halfpos;
86
static int	halfpos;
Lines 151-156 Link Here
151
		else
153
		else
152
			filter(f);
154
			filter(f);
153
	}
155
	}
156
	if (obuf != sobuf) {
157
		free(obuf);
158
	}
154
	exit(0);
159
	exit(0);
155
}
160
}
156
161
Lines 166-293 Link Here
166
{
171
{
167
	wint_t c;
172
	wint_t c;
168
	int i, w;
173
	int i, w;
174
	int copy = 0;
169
175
170
	while ((c = getwc(f)) != WEOF && col < MAXBUF) switch(c) {
176
	while ((c = getwc(f)) != WEOF) {
177
		if (col == buflen) {
178
			if (obuf == sobuf) {
179
				obuf = NULL;
180
				copy = 1;
181
			}
182
			obuf = realloc(obuf, sizeof(*obuf) * 2 * buflen);
183
			if (obuf == NULL) {
184
				obuf = sobuf;
185
				break;
186
			} else if (copy) {
187
				memcpy(obuf, sobuf, sizeof(*obuf) * buflen);
188
				copy = 0;
189
			}
190
			bzero((char *)(obuf + buflen), sizeof(*obuf) * buflen);
191
			buflen *= 2;
192
		}
193
		switch(c) {
194
		case '\b':
195
			if (col > 0)
196
				col--;
197
			continue;
171
198
172
	case '\b':
199
		case '\t':
173
		if (col > 0)
200
			col = (col+8) & ~07;
174
			col--;
201
			if (col > maxcol)
175
		continue;
202
				maxcol = col;
203
			continue;
176
204
177
	case '\t':
205
		case '\r':
178
		col = (col+8) & ~07;
206
			col = 0;
179
		if (col > maxcol)
207
			continue;
180
			maxcol = col;
181
		continue;
182
208
183
	case '\r':
209
		case SO:
184
		col = 0;
210
			mode |= ALTSET;
185
		continue;
211
			continue;
186
212
187
	case SO:
213
		case SI:
188
		mode |= ALTSET;
214
			mode &= ~ALTSET;
189
		continue;
215
			continue;
190
216
191
	case SI:
217
		case IESC:
192
		mode &= ~ALTSET;
218
			switch (c = getwc(f)) {
193
		continue;
219
			case HREV:
220
				if (halfpos == 0) {
221
					mode |= SUPERSC;
222
					halfpos--;
223
				} else if (halfpos > 0) {
224
					mode &= ~SUBSC;
225
					halfpos--;
226
				} else {
227
					halfpos = 0;
228
					reverse();
229
				}
230
				continue;
194
231
195
	case IESC:
232
			case HFWD:
196
		switch (c = getwc(f)) {
233
				if (halfpos == 0) {
234
					mode |= SUBSC;
235
					halfpos++;
236
				} else if (halfpos < 0) {
237
					mode &= ~SUPERSC;
238
					halfpos++;
239
				} else {
240
					halfpos = 0;
241
					fwd();
242
				}
243
				continue;
197
244
198
		case HREV:
245
			case FREV:
199
			if (halfpos == 0) {
200
				mode |= SUPERSC;
201
				halfpos--;
202
			} else if (halfpos > 0) {
203
				mode &= ~SUBSC;
204
				halfpos--;
205
			} else {
206
				halfpos = 0;
207
				reverse();
246
				reverse();
247
				continue;
248
249
			default:
250
				errx(1, "unknown escape sequence in input: %o, %o", IESC, c);
208
			}
251
			}
209
			continue;
252
			continue;
210
253
211
		case HFWD:
254
		case '_':
212
			if (halfpos == 0) {
255
			if (obuf[col].c_char || obuf[col].c_width < 0) {
213
				mode |= SUBSC;
256
				while (col > 0 && obuf[col].c_width < 0)
214
				halfpos++;
257
					col--;
215
			} else if (halfpos < 0) {
258
				w = obuf[col].c_width;
216
				mode &= ~SUPERSC;
259
				for (i = 0; i < w; i++)
217
				halfpos++;
260
					obuf[col++].c_mode |= UNDERL | mode;
218
			} else {
261
				if (col > maxcol)
219
				halfpos = 0;
262
					maxcol = col;
220
				fwd();
263
				continue;
221
			}
264
			}
265
			obuf[col].c_char = '_';
266
			obuf[col].c_width = 1;
267
			/* FALLTHROUGH */
268
		case ' ':
269
			col++;
270
			if (col > maxcol)
271
				maxcol = col;
222
			continue;
272
			continue;
223
273
224
		case FREV:
274
		case '\n':
225
			reverse();
275
			flushln();
226
			continue;
276
			continue;
227
277
278
		case '\f':
279
			flushln();
280
			putwchar('\f');
281
			continue;
282
228
		default:
283
		default:
229
			errx(1, "unknown escape sequence in input: %o, %o", IESC, c);
284
			if ((w = wcwidth(c)) <= 0)	/* non printing */
230
		}
285
				continue;
231
		continue;
286
			if (obuf[col].c_char == '\0') {
232
287
				obuf[col].c_char = c;
233
	case '_':
288
				for (i = 0; i < w; i++)
234
		if (obuf[col].c_char || obuf[col].c_width < 0) {
289
					obuf[col + i].c_mode = mode;
235
			while (col > 0 && obuf[col].c_width < 0)
290
				obuf[col].c_width = w;
236
				col--;
291
				for (i = 1; i < w; i++)
237
			w = obuf[col].c_width;
292
					obuf[col + i].c_width = -1;
238
			for (i = 0; i < w; i++)
293
			} else if (obuf[col].c_char == '_') {
239
				obuf[col++].c_mode |= UNDERL | mode;
294
				obuf[col].c_char = c;
295
				for (i = 0; i < w; i++)
296
					obuf[col + i].c_mode |= UNDERL|mode;
297
				obuf[col].c_width = w;
298
				for (i = 1; i < w; i++)
299
					obuf[col + i].c_width = -1;
300
			} else if ((wint_t)obuf[col].c_char == c) {
301
				for (i = 0; i < w; i++)
302
					obuf[col + i].c_mode |= BOLD|mode;
303
			} else {
304
				w = obuf[col].c_width;
305
				for (i = 0; i < w; i++)
306
					obuf[col + i].c_mode = mode;
307
			}
308
			col += w;
240
			if (col > maxcol)
309
			if (col > maxcol)
241
				maxcol = col;
310
				maxcol = col;
242
			continue;
311
			continue;
243
		}
312
		}
244
		obuf[col].c_char = '_';
245
		obuf[col].c_width = 1;
246
		/* FALLTHROUGH */
247
	case ' ':
248
		col++;
249
		if (col > maxcol)
250
			maxcol = col;
251
		continue;
252
253
	case '\n':
254
		flushln();
255
		continue;
256
257
	case '\f':
258
		flushln();
259
		putwchar('\f');
260
		continue;
261
262
	default:
263
		if ((w = wcwidth(c)) <= 0)	/* non printing */
264
			continue;
265
		if (obuf[col].c_char == '\0') {
266
			obuf[col].c_char = c;
267
			for (i = 0; i < w; i++)
268
				obuf[col + i].c_mode = mode;
269
			obuf[col].c_width = w;
270
			for (i = 1; i < w; i++)
271
				obuf[col + i].c_width = -1;
272
		} else if (obuf[col].c_char == '_') {
273
			obuf[col].c_char = c;
274
			for (i = 0; i < w; i++)
275
				obuf[col + i].c_mode |= UNDERL|mode;
276
			obuf[col].c_width = w;
277
			for (i = 1; i < w; i++)
278
				obuf[col + i].c_width = -1;
279
		} else if ((wint_t)obuf[col].c_char == c) {
280
			for (i = 0; i < w; i++)
281
				obuf[col + i].c_mode |= BOLD|mode;
282
		} else {
283
			w = obuf[col].c_width;
284
			for (i = 0; i < w; i++)
285
				obuf[col + i].c_mode = mode;
286
		}
287
		col += w;
288
		if (col > maxcol)
289
			maxcol = col;
290
		continue;
291
	}
313
	}
292
	if (ferror(f))
314
	if (ferror(f))
293
		err(1, NULL);
315
		err(1, NULL);
Lines 405-411 Link Here
405
initbuf(void)
427
initbuf(void)
406
{
428
{
407
429
408
	bzero((char *)obuf, sizeof (obuf));	/* depends on NORMAL == 0 */
430
	bzero((char *)obuf, buflen * sizeof(*obuf)); /* depends on NORMAL == 0 */
409
	col = 0;
431
	col = 0;
410
	maxcol = 0;
432
	maxcol = 0;
411
	mode &= ALTSET;
433
	mode &= ALTSET;

Return to bug 210344