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