Annotation of solidite/utils/head.cpp, revision 1.1.1.1
1.1 user 1: /* Copyright (c) 2026 The Solidite Developers
2: *
3: * This program is free software: you can redistribute it and/or modify it under
4: * the terms of the GNU Affero General Public License as published by the Free
5: * Software Foundation, either version 3 of the License, or (at your option)
6: * any later version.
7: *
8: * This program is distributed in the hope that it will be useful, but WITHOUT
9: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10: * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
11: * details.
12: *
13: * You should have received a copy of the GNU Affero General Public License
14: * along with this program. If not, see <https://www.gnu.org/licenses/>. */
15:
16: #include <bitset>
17: #include <fstream>
18: #include <iostream>
19: #include <locale>
20: #include <string>
21: #include <vector>
22:
23: #include <cstring>
24: #include <cstdint>
25:
26: int main(int argc, char* argv[]) {
27: // locale work
28: std::locale::global(std::locale(""));
29: std::cerr.imbue(std::locale());
30:
31: size_t number = 10;
32: std::vector<std::string> files;
33: std::bitset<3> options = 0b000;
34: /* options[0]=stop process options (-- stop processing options if set to 1)
35: * options[1]=skip next argv - in case of -c 10, dont process 10 as a file
36: * options[2]=type (either -c or -n, default=0 -n 10) */
37:
38: for (int i = 1; i < argc; ++i) {
39: if (options.test(1) == 1) {
40: options.reset(1);
41: continue;
42: } else if (options.test(0) == 0) {
43: if (std::strcmp(argv[i], "--") == 0) {
44: options.set(0);
45: continue;
46: } else if (std::strcmp(argv[i], "-c") == 0) {
47: if (i + 1 > argc - 1) {
48: std::cerr << "byte required after -c\n";
49: return 1;
50: } else {
51: number = std::atoi(argv[i + 1]);
52: options.set(2);
53: options.set(1);
54: continue;
55: }
56: } else if (std::strcmp(argv[i], "-n") == 0) {
57: if (i + 1 > argc - 1) {
58: std::cerr << "line number required after -n\n";
59: return 1;
60: } else {
61: number = std::atoi(argv[i + 1]);
62: options.reset(2);
63: options.set(1);
64: continue;
65: }
66: }
67: }
68: files.push_back(argv[i]);
69: }
70:
71: if (files.empty())
72: files.push_back("-");
73: // induce an stdin into the files if empty
74: for (std::string file : files) {
75: if (file == "-") {
76: std::string line;
77: if (options.test(2) == 0) {
78: for (size_t i = 0; i < number; ++i) {
79: std::getline(std::cin, line);
80: std::cout << line + '\n';
81: }
82: } else if (options.test(2) == 1) {
83: size_t chars = 0;
84: while (chars < number) {
85: std::getline(std::cin, line);
86: if (chars + line.length() < number) {
87: line += '\n';
88: chars += line.length();
89: } else {
90: line = line.substr(0, number - chars);
91: std::cout << line;
92: break;
93: }
94: std::cout << line;
95: }
96: }
97: continue;
98: }
99:
100: std::ifstream read(file);
101: if (!read.is_open()) {
102: std::cerr << "failed to read: " + file + '\n';
103: continue;
104: }
105:
106: std::string line;
107: if (options.test(2) == 0) {
108: for (size_t i = 0; i < number; ++i) {
109: std::getline(read, line);
110: std::cout << line + '\n';
111: }
112: } else if (options.test(2) == 1) {
113: size_t chars = 0;
114: while (chars < number) {
115: std::getline(read, line);
116: if (chars + line.length() < number) {
117: line += '\n';
118: chars += line.length();
119: } else {
120: line = line.substr(0, number - chars);
121: std::cout << line;
122: break;
123: }
124: std::cout << line;
125: }
126: }
127: read.close();
128: }
129: return 0;
130: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>