Annotation of src/usr.bin/rev/rev.c, Revision 1.16
1.16 ! cheloha 1: /* $OpenBSD: rev.c,v 1.15 2022/01/29 00:11:54 cheloha Exp $ */
1.1 deraadt 2: /* $NetBSD: rev.c,v 1.5 1995/09/28 08:49:40 tls Exp $ */
3:
4: /*-
5: * Copyright (c) 1987, 1992, 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
1.6 millert 16: * 3. Neither the name of the University nor the names of its contributors
1.1 deraadt 17: * may be used to endorse or promote products derived from this software
18: * without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30: * SUCH DAMAGE.
31: */
32:
33: #include <sys/types.h>
34:
35: #include <err.h>
36: #include <errno.h>
1.13 martijn 37: #include <locale.h>
1.1 deraadt 38: #include <stdio.h>
39: #include <stdlib.h>
40: #include <string.h>
41: #include <unistd.h>
42:
1.15 cheloha 43: int multibyte;
44:
1.13 martijn 45: int isu8cont(unsigned char);
1.15 cheloha 46: int rev_file(const char *);
1.5 millert 47: void usage(void);
1.1 deraadt 48:
49: int
1.7 deraadt 50: main(int argc, char *argv[])
1.1 deraadt 51: {
1.15 cheloha 52: int ch, rval;
1.11 deraadt 53:
1.13 martijn 54: setlocale(LC_CTYPE, "");
1.14 schwarze 55: multibyte = MB_CUR_MAX > 1;
1.13 martijn 56:
1.12 deraadt 57: if (pledge("stdio rpath", NULL) == -1)
58: err(1, "pledge");
1.1 deraadt 59:
1.3 millert 60: while ((ch = getopt(argc, argv, "")) != -1)
1.1 deraadt 61: switch(ch) {
62: default:
63: usage();
64: }
65:
66: argc -= optind;
67: argv += optind;
68:
69: rval = 0;
1.15 cheloha 70: if (argc == 0) {
1.16 ! cheloha 71: if (pledge("stdio", NULL) == -1)
! 72: err(1, "pledge");
! 73:
1.15 cheloha 74: rval = rev_file(NULL);
75: } else {
76: for (; *argv != NULL; argv++)
77: rval |= rev_file(*argv);
78: }
1.13 martijn 79: return rval;
80: }
81:
82: int
83: isu8cont(unsigned char c)
84: {
1.14 schwarze 85: return (c & (0x80 | 0x40)) == 0x80;
1.15 cheloha 86: }
87:
88: int
89: rev_file(const char *path)
90: {
91: char *p = NULL, *t, *te, *u;
92: const char *filename;
93: FILE *fp;
94: size_t ps = 0;
95: ssize_t len;
96: int rval = 0;
97:
98: if (path != NULL) {
99: fp = fopen(path, "r");
100: if (fp == NULL) {
101: warn("%s", path);
102: return 1;
103: }
104: filename = path;
105: } else {
106: fp = stdin;
107: filename = "stdin";
108: }
109:
110: while ((len = getline(&p, &ps, fp)) != -1) {
111: if (p[len - 1] == '\n')
112: --len;
113: for (t = p + len - 1; t >= p; --t) {
114: te = t;
115: if (multibyte)
116: while (t > p && isu8cont(*t))
117: --t;
118: for (u = t; u <= te; ++u)
119: if (putchar(*u) == EOF)
120: err(1, "stdout");
121: }
122: if (putchar('\n') == EOF)
123: err(1, "stdout");
124: }
125: free(p);
126: if (ferror(fp)) {
127: warn("%s", filename);
128: rval = 1;
129: }
130:
131: (void)fclose(fp);
132:
133: return rval;
1.1 deraadt 134: }
135:
136: void
1.7 deraadt 137: usage(void)
1.1 deraadt 138: {
1.9 jasper 139: extern char *__progname;
140:
141: (void)fprintf(stderr, "usage: %s [file ...]\n", __progname);
1.1 deraadt 142: exit(1);
143: }