refer4.c revision 719:6c26331bc6b8
1/*
2 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
3 * Use is subject to license terms.
4 */
5
6/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
7/*	  All Rights Reserved  	*/
8
9/*
10 * Copyright (c) 1980 Regents of the University of California.
11 * All rights reserved. The Berkeley software License Agreement
12 * specifies the terms and conditions for redistribution.
13 */
14
15#pragma ident	"%Z%%M%	%I%	%E% SMI"
16
17#include "refer..c"
18#include <locale.h>
19
20#define	punctuat(c)	(c == '.' || c == '?' || c == '!' || \
21			    c == ',' || c == ';' || c == ':')
22
23static int gate = 0;
24static char buff[BUFSIZ];
25
26extern void err();
27
28char *trimnl(char *);
29
30void
31output(char *s)
32{
33	if (gate)
34		fputs(buff, ftemp);
35	else
36		gate = 1;
37	strcpy(buff, s);
38	if (strlen(buff) > BUFSIZ)
39		err(gettext("one buff too big (%d)!"), BUFSIZ);
40}
41
42void
43append(char *s)
44{
45	char *p;
46	int lch;
47
48	trimnl(buff);
49	for (p = buff; *p; p++)
50		;
51	lch = *--p;
52	if (postpunct && punctuat(lch))
53		*p = NULL;
54	else /* pre-punctuation */
55		switch (lch) {
56		case '.':
57		case '?':
58		case '!':
59		case ',':
60		case ';':
61		case ':':
62			*p++ = lch;
63			*p = NULL;
64		}
65	strcat(buff, s);
66	if (postpunct)
67		switch (lch) {
68		case '.':
69		case '?':
70		case '!':
71		case ',':
72		case ';':
73		case ':':
74			for (p = buff; *p; p++)
75				;
76			if (*--p == '\n')
77				*p = NULL;
78			*p++ = lch;
79			*p++ = '\n';
80			*p = NULL;
81		}
82	if (strlen(buff) > BUFSIZ)
83		err(gettext("output buff too long (%d)"), BUFSIZ);
84}
85
86void
87flout(void)
88{
89	if (gate)
90		fputs(buff, ftemp);
91	gate = 0;
92}
93
94char *
95trimnl(char *ln)
96{
97	char *p = ln;
98
99	while (*p)
100		p++;
101	p--;
102	if (*p == '\n')
103		*p = 0;
104	return (ln);
105}
106