Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libcmd / wc.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: wc.c /main/3 1995/11/01 19:09:03 rswiston $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
34 *           This software is licensed by AT&T Corp.            *
35 *       under the terms and conditions of the license in       *
36 *       http://www.research.att.com/orgs/ssr/book/reuse        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46
47 /* : : generated by proto : : */
48
49 #if !defined(__PROTO__)
50 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
51 #if defined(__cplusplus)
52 #define __MANGLE__      "C"
53 #else
54 #define __MANGLE__
55 #endif
56 #define __STDARG__
57 #define __PROTO__(x)    x
58 #define __OTORP__(x)
59 #define __PARAM__(n,o)  n
60 #if !defined(__STDC__) && !defined(__cplusplus)
61 #if !defined(c_plusplus)
62 #define const
63 #endif
64 #define signed
65 #define void            int
66 #define volatile
67 #define __V_            char
68 #else
69 #define __V_            void
70 #endif
71 #else
72 #define __PROTO__(x)    ()
73 #define __OTORP__(x)    x
74 #define __PARAM__(n,o)  o
75 #define __MANGLE__
76 #define __V_            char
77 #define const
78 #define signed
79 #define void            int
80 #define volatile
81 #endif
82 #if defined(__cplusplus) || defined(c_plusplus)
83 #define __VARARG__      ...
84 #else
85 #define __VARARG__
86 #endif
87 #if defined(__STDARG__)
88 #define __VA_START__(p,a)       va_start(p,a)
89 #else
90 #define __VA_START__(p,a)       va_start(p)
91 #endif
92 #endif
93 static const char id[] = "\n@(#)wc (AT&T Bell Laboratories) 08/11/94\0\n";
94
95 #include <cmdlib.h>
96 #include <wc.h>
97 #include <ls.h>
98
99 #define ERRORMAX        125
100
101 static void printout __PARAM__((register Wc_t *wp, register char *name,register int mode), (wp, name, mode)) __OTORP__(register Wc_t *wp; register char *name;register int mode;){
102         if(mode&WC_LINES)
103                 sfprintf(sfstdout," %7lu",wp->lines);
104         if(mode&WC_WORDS)
105                 sfprintf(sfstdout," %7lu",wp->words);
106         if(mode&WC_CHARS)
107                 sfprintf(sfstdout," %7lu",wp->chars);
108         sfprintf(sfstdout," %s\n",name?name:"");
109 }
110
111 int
112 b_wc __PARAM__((int argc,register char **argv), (argc, argv)) __OTORP__(int argc;register char **argv;){
113         register char   *cp;
114         register int    mode=0, n;
115         register Wc_t   *wp;
116         Sfio_t          *fp;
117         long            tlines=0, twords=0, tchars=0;
118         struct stat     statb;
119
120         NoP(id[0]);
121         NoP(argc);
122         cmdinit(argv);
123         while (n = optget(argv,"lw[cm] [file...]")) switch (n)
124         {
125         case 'w':
126                 mode |= WC_WORDS;
127                 break;
128         case 'c':
129         case 'm':
130                 if(mode&WC_CHARS)
131                 {
132                         if((n=='m') ^ ((mode&WC_MBYTE)!=0))
133                                 error(2, "c and m are mutually exclusive");
134                 }
135                 mode |= WC_CHARS;
136                 if(n=='m')
137                         mode |= WC_MBYTE;
138                 break;
139         case 'l':
140                 mode |= WC_LINES;
141                 break;
142         case ':':
143                 error(2, opt_info.arg);
144                 break;
145         case '?':
146                 error(ERROR_usage(2), opt_info.arg);
147                 break;
148         }
149         argv += opt_info.index;
150         if (error_info.errors) error(ERROR_usage(2),optusage(NiL));
151         if(!(mode&(WC_WORDS|WC_CHARS|WC_LINES)))
152                 mode |= (WC_WORDS|WC_CHARS|WC_LINES);
153         if(!(wp = wc_init(NiL)))
154                 error(3,"internal error");
155         if(!(mode&WC_WORDS))
156         {
157                 memzero(wp->space, (1<<CHAR_BIT));
158                 wp->space['\n'] = -1;
159         }
160         if(cp = *argv)
161                 argv++;
162         do
163         {
164                 if(!cp || streq(cp,"-"))
165                         fp = sfstdin;
166                 else if(!(fp = sfopen(NiL,cp,"r")))
167                 {
168                         error(ERROR_system(0),"%s: cannot open",cp);
169                         continue;
170                 }
171                 if(cp)
172                         n++;
173                 if(!(mode&(WC_WORDS|WC_LINES)) && fstat(sffileno(fp),&statb)>=0
174                          && S_ISREG(statb.st_mode))
175                 {
176                         wp->chars = statb.st_size - lseek(sffileno(fp),0L,1);
177                         lseek(sffileno(fp),0L,2);
178                 }
179                 else
180                         wc_count(wp, fp);
181                 if(fp!=sfstdin)
182                         sfclose(fp);
183                 tchars += wp->chars;
184                 twords += wp->words;
185                 tlines += wp->lines;
186                 printout(wp,cp,mode);
187         }
188         while(cp= *argv++);
189         if(n>1)
190         {
191                 wp->lines = tlines;
192                 wp->chars = tchars;
193                 wp->words = twords;
194                 printout(wp,"total",mode);
195         }
196         return(error_info.errors<ERRORMAX?error_info.errors:ERRORMAX);
197 }