Suppress error during test
[nibswap.git] / src / nibswap.c
blob8d22f73f29bd6b827763439139a3e011905ce084
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2022 Alessio Chiapperini
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
28 #ifndef _POSIX_C_SOURCE
29 # define _POSIX_C_SOURCE 200112L
30 #elif _POSIX_C_SOURCE < 200112L
31 # error incompatible _POSIX_C_SOURCE level
32 #endif
34 #include <limits.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <string.h>
38 #include <unistd.h>
40 static void
41 usage(void)
43 (void)fprintf(stderr, "usage: nibswap [-h] [file ...]\n");
44 exit(1);
47 static int
48 nibswap(const char *src)
50 char line[LINE_MAX] = {0};
51 FILE *ifile;
52 size_t i, len;
53 int ret;
55 ret = 0;
56 ifile = stdin;
57 if (src[0] != '-' || src[1] != '\0') {
58 ifile = fopen(src, "r");
59 if (ifile == 0) {
60 ret = 1;
61 perror("nibswap");
62 goto open_err;
66 while (fgets(line, LINE_MAX, ifile) != 0) {
67 line[strcspn(line, "\n")] = 0;
69 len = strlen(line);
70 if (len % 2 != 0) {
71 ret = 1;
72 (void)fprintf(stderr, "nibswap: the length of the "
73 "string '%s' must be even\n", line);
74 break;
77 for (i = 0; i+1 < len; i+=2) {
78 char tmp = 0;
79 tmp = line[i];
80 line[i] = line[i+1];
81 line[i+1] = tmp;
83 (void)printf("%s\n", line);
86 (void)fclose(ifile);
87 open_err:
88 return (ret);
91 int
92 main(int argc, char *argv[])
94 char *def[] = { "-" };
95 int opt;
97 while ((opt = getopt(argc, argv, "hu")) != -1) {
98 switch (opt) {
99 case 'h':
100 usage();
101 break;
102 case '?':
103 /* FALLTHROUGH */
104 default:
105 usage();
109 argc -= optind;
110 argv += optind;
112 if (argc == 0) {
113 argc = 1;
114 argv = def;
117 for (int i = 0; i < argc; i++) {
118 if (nibswap(argv[i]) > 0) {
119 return (1);
123 return (0);