1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32: #include <sys/cdefs.h>
33: #ifndef lint
34: __COPYRIGHT("@(#) Copyright (c) 1992, 1993\n\
35: The Regents of the University of California. All rights reserved.\n");
36: #endif
37:
38: #ifndef lint
39: #if 0
40: static char sccsid[] = "@(#)pig.c 8.2 (Berkeley) 5/4/95";
41: #else
42: __RCSID("$NetBSD: pig.c,v 1.11 2004/11/05 21:30:32 dsl Exp $");
43: #endif
44: #endif
45:
46: #include <sys/types.h>
47:
48: #include <ctype.h>
49: #include <err.h>
50: #include <stdio.h>
51: #include <stdlib.h>
52: #include <string.h>
53: #include <unistd.h>
54:
55: int main(int, char *[]);
56: void pigout(char *, int);
57: void usage(void) __attribute__((__noreturn__));
58:
59: int
60: main(argc, argv)
61: int argc;
62: char *argv[];
63: {
64: int len;
65: int ch;
66: char buf[1024];
67:
68:
69: setregid(getgid(), getgid());
70:
71: while ((ch = getopt(argc, argv, "")) != -1)
72: switch(ch) {
73: case '?':
74: default:
75: usage();
76: }
77: argc -= optind;
78: argv += optind;
79:
80: for (len = 0; (ch = getchar()) != EOF;) {
81: if (isalpha(ch)) {
82: if ((size_t)len >= sizeof(buf))
83: errx(1, "ate too much!");
84: buf[len++] = ch;
85: continue;
86: }
87: if (len != 0) {
88: pigout(buf, len);
89: len = 0;
90: }
91: (void)putchar(ch);
92: }
93: exit(0);
94: }
95:
96: void
97: pigout(buf, len)
98: char *buf;
99: int len;
100: {
101: int ch, start, i;
102: int olen, allupper, firstupper;
103:
104:
105: allupper = firstupper = isupper((unsigned char)buf[0]);
106: for (i = 1; i < len && allupper; i++)
107: allupper = allupper && isupper((unsigned char)buf[i]);
108:
109:
110:
111:
112:
113: if (strchr("aeiouAEIOU", buf[0]) != NULL) {
114: (void)printf("%.*s%s", len, buf,
115: allupper ? "WAY" : "way");
116: return;
117: }
118:
119:
120:
121:
122:
123: if (!allupper)
124: buf[0] = tolower((unsigned char)buf[0]);
125: for (start = 0, olen = len;
126: !strchr("aeiouyAEIOUY", buf[start]) && start < olen;) {
127: ch = buf[len++] = buf[start++];
128: if ((ch == 'q' || ch == 'Q') && start < olen &&
129: (buf[start] == 'u' || buf[start] == 'U'))
130: buf[len++] = buf[start++];
131: }
132: if (firstupper)
133: buf[start] = toupper((unsigned char)buf[start]);
134: (void)printf("%.*s%s", olen, buf + start, allupper ? "AY" : "ay");
135: }
136:
137: void
138: usage()
139: {
140: (void)fprintf(stderr, "usage: pig\n");
141: exit(1);
142: }