Bash-4.3 distribution sources and documentation
[platform/upstream/bash.git] / support / xcase.c
1 /* xcase - change uppercase characters to lowercase or vice versa. */
2
3 /* Copyright (C) 2008,2009 Free Software Foundation, Inc.
4
5    This file is part of GNU Bash.
6
7    Bash is free software: you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation, either version 3 of the License, or
10    (at your option) any later version.
11
12    Bash is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with Bash.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include <stdio.h>
26 #include <ctype.h>
27
28 #if HAVE_UNISTD_H
29 #include <unistd.h>
30 #endif
31
32 #include "bashansi.h"
33 #include <errno.h>
34
35 #ifndef errno
36 extern int errno;
37 #endif
38
39 #define LOWER   1
40 #define UPPER   2
41
42 int
43 main(ac, av)
44 int     ac;
45 char    **av;
46 {
47         int     c, x;
48         int     op;
49         FILE    *inf;
50
51         op = 0;
52         while ((c = getopt(ac, av, "lnu")) != EOF) {
53                 switch (c) {
54                 case 'n':
55                         setbuf (stdout, (char *)NULL);
56                         break;
57                 case 'u':
58                         op = UPPER;
59                         break;
60                 case 'l':
61                         op = LOWER;
62                         break;
63                 default:
64                         fprintf(stderr, "casemod: usage: casemod [-lnu] [file]\n");
65                         exit(2);
66                 }
67         }
68         av += optind;
69         ac -= optind;
70
71         if (av[0] && (av[0][0] != '-' || av[0][1])) {
72                 inf = fopen(av[0], "r");
73                 if (inf == 0) {
74                         fprintf(stderr, "casemod: %s: cannot open: %s\n", av[0], strerror(errno));
75                         exit(1);
76                 }
77         } else
78                 inf = stdin;
79
80         while ((c = getc(inf)) != EOF) {
81                 switch (op) {
82                 case UPPER:
83                         x = islower(c) ? toupper(c) : c;
84                         break;
85                 case LOWER:
86                         x = isupper(c) ? tolower(c) : c;
87                         break;
88                 default:
89                         x = c;
90                         break;
91                 }
92                 putchar(x);
93         }
94                         
95         exit(0);
96 }