Imported from ../bash-4.0-rc1.tar.gz.
[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 main(ac, av)
43 int     ac;
44 char    **av;
45 {
46         int     c, x;
47         int     op;
48         FILE    *inf;
49
50         op = 0;
51         while ((c = getopt(ac, av, "lnu")) != EOF) {
52                 switch (c) {
53                 case 'n':
54                         setbuf (stdout, (char *)NULL);
55                         break;
56                 case 'u':
57                         op = UPPER;
58                         break;
59                 case 'l':
60                         op = LOWER;
61                         break;
62                 default:
63                         fprintf(stderr, "casemod: usage: casemod [-lnu] [file]\n");
64                         exit(2);
65                 }
66         }
67         av += optind;
68         ac -= optind;
69
70         if (av[0] && (av[0][0] != '-' || av[0][1])) {
71                 inf = fopen(av[0], "r");
72                 if (inf == 0) {
73                         fprintf(stderr, "casemod: %s: cannot open: %s\n", av[0], strerror(errno));
74                         exit(1);
75                 }
76         } else
77                 inf = stdin;
78
79         while ((c = getc(inf)) != EOF) {
80                 switch (op) {
81                 case UPPER:
82                         x = islower(c) ? toupper(c) : c;
83                         break;
84                 case LOWER:
85                         x = isupper(c) ? tolower(c) : c;
86                         break;
87                 default:
88                         x = c;
89                         break;
90                 }
91                 putchar(x);
92         }
93                         
94         exit(0);
95 }