diff --git a/CONDUCT b/CONDUCT index 4dd97a9..05462d2 100644 --- a/CONDUCT +++ b/CONDUCT @@ -36,9 +36,9 @@ issues, pull requests, and other endeavors in order to keep yourself and others from being overwhelmed with responsibility, either from your zeal or your negligence. -If you notice an issue, open an issue as soon as you can. If you see a neglected -branch, open a pull request or comment on an existing one, if applicable. Be -diligent in your commitment to making this project work. +If you notice an issue, open an issue as soon as you can. If you see a +neglected branch, open a pull request or comment on an existing one, if +applicable. Be diligent in your commitment to making this project work. 6. Patience (Khanti) @@ -81,3 +81,9 @@ more insight. [0] [1] + +-- +Copyright © 2024–2025 Emma Tebibyte + +This work is licensed under CC BY-SA 4.0. To view a copy of this license, visit +. diff --git a/COPYING.DOC b/COPYING.DOC new file mode 100644 index 0000000..2d58298 --- /dev/null +++ b/COPYING.DOC @@ -0,0 +1,428 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/Makefile b/Makefile index d104d7f..34bdcb0 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. # The octal escape \043 is utilized twice in this file as make(1p) will # interpret a hash in a rule as an inline comment. @@ -62,7 +62,7 @@ dist: all docs install: dist cp -r $(DESTDIR)/* / -TESTFILES != for file in tests/*.mk; do printf '%s ' "$$file"; done +TESTFILES != ls tests/*.mk TESTS != printf '%s\n' "$(TESTFILES)" | xargs -n1 basename \ | sed 's/\.mk/_tests/g' diff --git a/README b/README index 0c01d5e..f98056c 100644 --- a/README +++ b/README @@ -14,9 +14,9 @@ utilities do, but to invent new utilities to perform the same tasks in more intuitive ways. GNU and BSD extensions are convenient but often unhealthy, forgetting the purposes of the tools they extend, or building into existing utilities features that would be more useful as their own tools to be used -anywhere. Other utility sets aim to provide a number of fully-featured -programs to be used individually, Harakit utilities are meant to be easily -composable and work together in pipelines. +anywhere. Other utility sets aim to provide a number of fully-featured programs +to be used individually, Harakit utilities are meant to be easily composable +and work together in pipelines. See docs/ for more on the specific utilities currently implemented. diff --git a/docs/dj.1 b/docs/dj.1 index 79096d5..ac0a1cb 100644 --- a/docs/dj.1 +++ b/docs/dj.1 @@ -1,5 +1,5 @@ .\" Copyright (c) 2024 DTB -.\" Copyright (c) 2024 Emma Tebibyte +.\" Copyright (c) 2024–2025 Emma Tebibyte .\" .\" This work is licensed under CC BY-SA 4.0. To see a copy of this license, .\" visit . @@ -28,45 +28,44 @@ dj Perform precise read and write operations on files. This utility is useful for reading and writing binary data to and from disks. -This manual page uses the terms \(lqskip\(rq and \(lqseek\(rq to refer to moving -to a specified byte by index in the input and output of the program +This manual page uses the terms \(lqskip\(rq and \(lqseek\(rq to refer to +moving to a specified byte by index in the input and output of the program respectively. This language is inherited from the .BR dd (1p) -utility and used here to decrease ambiguity. +specification in \*(Px and used here to decrease ambiguity. The offset used when skipping or seeking refers to how many bytes are skipped or sought. Running .BR dj (1) -with a skip offset of 1 skips one byte into the input and reads from the second -byte onwards. A programmer may think of a file as a zero-indexed array of -bytes; in this analogy, the offset given is the index of the byte at which to -start reading or writing. +with a skip offset of 1 reads from the second byte onwards. A programmer may +think of a file as a zero-indexed array of bytes; in this analogy, the offset +given is the index of the byte at which to start reading or writing. .\" .SH OPTIONS .IP \fB-i\fP\ \fIfile\fP Takes a file path as an argument and opens it for use as an input. .IP \fB-b\fP\ \fIblock_size\fP -Takes a numeric argument as the size in bytes of the input buffer, the default -being 1024. -.IP \fB-s\fP +Takes a numeric argument as the size in bytes of the input buffer. If this +option is not specified, the size is 1024 bytes. +.IP \fB-s\fP \fIoffset\fP Takes a numeric argument as the index of the byte at which reading will -commence; \(lqskips\(rq that number of bytes. If the standard input is used, -bytes read to this point are discarded. -.IP \fB-o\fP +commence; the program \(lqskips\(rq that number of \fIbytes\fP. If the standard +input is used, bytes read to this point are discarded. +.IP \fB-o\fP \fIfile\fP Takes a file path as an argument and opens it for use as an output. .IP \fB-B\fP\ \fIblock_size\fP -Takes a numeric argument as the size in bytes of the output buffer, the default -being 1024. Note that this option only affects the size of output writes and not -the amount of output data itself. See the CAVEATS section. -.IP \fB-S\fP +Takes a numeric argument as the size in bytes of the output buffer. The default +size is 1024. Note that this option only affects the size of output writes and +not the amount of output data itself. See the CAVEATS section. +.IP \fB-S\fP \fIoffset\fP Takes a numeric argument as the index of the byte at which writing will -commence; \(lqseeks\(rq that number of bytes. If the standard output is used, -null characters are printed. +commence; the program \(lqseeks\(rq that number of bytes. If the standard +output is used, null characters are first printed this many times. .IP \fB-a\fP -Accepts a single literal byte with which the input buffer is padded in the event -of an incomplete read from the input file. If the option argument is empty, the -null byte is used. +Accepts a single literal byte with which the input buffer is padded in the +event of an incomplete read from the input file. If the option argument is +empty, the null byte is used. .IP \fB-c\fP Specifies a number of blocks to read. The default is 0, in which case the input is read until a partial or empty read is made. @@ -78,12 +77,12 @@ Retries failed reads once before exiting. .\" .SH STANDARD INPUT -The standard input shall be used as an input if no inputs are specified or if +The standard input shall be used as an input if none are specified or if the input file is \(lq-\(rq. .\" .SH STANDARD OUTPUT -The standard output shall be used as an output if no inputs are specified or if -the output file is \(lq-\(rq. +The standard output shall be used as an output if none are specified or if the +output file is \(lq-\(rq. .\" .SH EXAMPLES @@ -135,13 +134,12 @@ invocation. .\" .SH DIAGNOSTICS -On a partial or empty read, a diagnostic message is printed. Then, the program -exits unless the +On a partial or empty read, a diagnostic message is printed. Then, unless the .B -n -option is specified. +option is specified, the program exits. -By default, statistics are printed for input and output to the standard error in -the following format: +By default, statistics are printed for input and output to the standard error +in the following format: .RS {records read} {ASCII unit separator} {partial records read} @@ -172,8 +170,8 @@ If .B -n is specified along with the .B -c -option and a count, actual byte output is the product of the count and the input -block size and therefore may be lower than expected. If the +option and a count, actual byte output is the product of the count and the +input block size and therefore may be lower than expected. If the .B -a option is specified, this could make written data nonsensical. .\" @@ -202,12 +200,15 @@ The skipped or sought bytes while processing irregular files, such as streams, are reported in the diagnostic output, because they were actually read or written. This is as opposed to bytes skipped while processing regular files, which are not reported. + +Much of this program shares its functionality with +.BR mm (1). .\" .SH RATIONALE This program was based on the .BR dd (1p) -utility as specified in POSIX. While character conversion may have been the +utility as specified in \*(Px. While character conversion may have been the original intent of .BR dd (1p), it is irrelevant to its modern use. Because of this, this program eschews @@ -215,12 +216,18 @@ character conversion and adds typical option formatting, allowing seeks to be specified in bytes rather than in blocks, allowing arbitrary bytes as padding, and printing in a format that\(cqs easy for machines to parse. .\" +.SH AUTHOR + +Written by DTB +.MT trinity@trinity.moe +.ME . +.\" .SH COPYRIGHT Copyright \(co 2023 DTB. License AGPLv3+: GNU AGPL version 3 or later . .\" .SH SEE ALSO +.BR mm (1) .BR dd (1p) .BR lseek (3p) -.BR mm (1) diff --git a/docs/fileis.1 b/docs/fileis.1 index 9650f73..7925998 100644 --- a/docs/fileis.1 +++ b/docs/fileis.1 @@ -61,8 +61,8 @@ error code. The .BR test (1p) -utility contains functionality that was broken out into separate programs. Thus, -the scope of this program is narrower than it. Notably, the +utility contains functionality that was broken out into separate programs. \ +Thus, the scope of this program is narrower than it. Notably, the .B -h option is now invalid and therefore shows usage information instead of being an alias to the modern diff --git a/docs/fop.1 b/docs/fop.1 index b96033a..9afe364 100644 --- a/docs/fop.1 +++ b/docs/fop.1 @@ -28,13 +28,14 @@ is an ASCII record separator. .\" .SH CAVEATS -Field indices are zero-indexed, which may be unexpected behavior for some users. +Field indices are zero-indexed, which may be unexpected behavior for some +users. .\" .SH RATIONALE With the assumption that tools will output data separated with ASCII field -separators, there is a need for the ability to modify select fields in this data -easily and quickly. +separators, there is a need for the ability to modify select fields in this +data easily and quickly. The idea for this utility originated in the fact that the GNU .BR ls (1) diff --git a/docs/hru.1 b/docs/hru.1 index 6929d51..5be1fa8 100644 --- a/docs/hru.1 +++ b/docs/hru.1 @@ -16,8 +16,8 @@ hru Convert counts to higher units. Byte counts will be read in the form of whole numbers from the standard input -and be written to the standard output the same number converted to a higher unit -of data as defined by the \fIInternational System of Units\fP. +and be written to the standard output the same number converted to a higher +unit of data as defined by the \fIInternational System of Units\fP. The program will convert the byte count to the highest unit possible where the value is greater than one. @@ -33,10 +33,11 @@ and print an error message. The GNU project\(cqs .BR ls (1) -implementation contains a human-readable option (\fB-h\fP) that, when specified, -makes the tool print size information in a format more immediately -readable. This functionality is useful not only in this context, so the decision -was made to split it into a new tool. The original functionality from GNU\(cqs +implementation contains a human-readable option (\fB-h\fP) that, when +specified, makes the tool print size information in a format more immediately +readable. This functionality is useful not only in this context, so the +decision was made to split it into a new tool. The original functionality from +GNU\(cqs .BR ls (1) can be emulated with .BR fop (1) diff --git a/docs/intcmp.1 b/docs/intcmp.1 index b90f23a..241358a 100644 --- a/docs/intcmp.1 +++ b/docs/intcmp.1 @@ -31,9 +31,10 @@ It may help to think of the .BR -g , and .B -l -options as equivalent to the infix algebraic \(lq=\(rq, \(lq>\(rq, and \(lq<\(rq -operators respectively, with each option putting its symbol between every given -integer. The following example is equivalent to evaluating \(lq1 < 2 < 3\(rq: +options as equivalent to the infix algebraic \(lq=\(rq, \(lq>\(rq, and +\(lq<\(rq operators respectively, with each option putting its symbol between +every given integer. The following example is equivalent to evaluating +\(lq1 < 2 < 3\(rq: \" .RS intcmp -l 1 2 3 diff --git a/docs/mm.1 b/docs/mm.1 index f641156..0772cfb 100644 --- a/docs/mm.1 +++ b/docs/mm.1 @@ -1,4 +1,5 @@ .\" Copyright (c) 2024 DTB +.\" Copyright (c) 2024–2025 Emma Tebibyte .\" .\" This work is licensed under CC BY-SA 4.0. To see a copy of this license, .\" visit . @@ -10,7 +11,7 @@ mm \(en middleman .SH SYNOPSIS mm -.RB [ -aetu ] +.RB [ -aet ] .RB [ -i\ input ] .RB [ -o\ output ] .\" @@ -26,16 +27,14 @@ Opens outputs for appending rather than updating. Use the standard error as an output. .IP \fB-t\fP Causes outputs to be overwritten instead of being truncated. -.IP \fB-u\fP -Ensures neither input or output will be buffered. .IP \fB-i\fP\ \fIinput\fP Opens a path as an input. If one or more of the input files is \(lq-\(rq or if no inputs are specified, the standard input shall be used. If specified as the last option and if there are trailing arguments to the program, they shall be appended to the list of files to use as inputs. .IP \fB-o\fP\ \fIoutput\fP -Opens a path as an output. If one or more of the output files is \(lq-\(rq or if -no outputs are specified and the +Opens a path as an output. If one or more of the output files is \(lq-\(rq or +if no outputs are specified and the .B -e option is not specified, the standard output shall be used. If specified as the last option and if there are trailing arguments to the program, they shall be @@ -43,7 +42,7 @@ appended to the list of files to use as outputs. .\" .SH DIAGNOSTICS -If an output cannot be written to, an error occurs; however, exiting will be +If an output cannot be written to, an error occurs; however, exiting will be deferred until writing to any other specified outputs completes. When an error is encountered, a diagnostic message is printed and the program @@ -57,10 +56,30 @@ The .BR cat (1p) and .BR tee (1p) -programs specified in POSIX together provide similar functionality. The +programs specified in \*(Px together provide similar functionality. The separation of the two sets of functionality into separate APIs seemed unncessary. .\" +.SH HISTORY + +This utility originally had a \fB-u\fP option for compatibility with cat(1p), +but this option is almost always default behavior in practice; therefore, it +was dropped both for simplicity and to expand the +.BR dj (1) +utility\(cqs niche. +.\" +.SH AUTHOR + +Written by DTB +.MT trinity@trinity.moe +.ME . +.\" +.SH COPYRIGHT + +Copyright © 2023 DTB. License AGPLv3+: GNU AGPL version 3 or later +. +.\" +.\" .SH COPYRIGHT Copyright \(co 2024 DTB. License AGPLv3+: GNU AGPL version 3 or later diff --git a/docs/npc.1 b/docs/npc.1 index 5acee9e..cf317ce 100644 --- a/docs/npc.1 +++ b/docs/npc.1 @@ -52,8 +52,8 @@ the .B -v option, is the bandage solution GNU and other software suites use. -This functionality is included in a separate tool because its usefulness extends -beyond that of +This functionality is included in a separate tool because its usefulness +extends beyond that of .BR cat (1p). .\" .SH AUTHOR diff --git a/docs/peek.1 b/docs/peek.1 index 9ec336c..dbec885 100644 --- a/docs/peek.1 +++ b/docs/peek.1 @@ -47,9 +47,9 @@ installed. .\" .SH CAVEATS -This program does nothing to prevent others from seeing the key presses input to -a keyboard. It also does not protect against the sound of typing being analyzed -to determine what was input without needing to see screen or keyboard. +This program does nothing to prevent others from seeing the key presses input +to a keyboard. It also does not protect against the sound of typing being +analyzed to determine what was input without needing to see screen or keyboard. Accepting secrets in shell scripts is probably not advisable. @@ -80,10 +80,10 @@ $ peek | head -n 1 | xargs printf '%s' | htpasswd -nBi _ | cut -d : -f 2 This is an .BR sh (1p) -command line that allows a user to write blindly into a text file but displaying -only written lines. Some writers have the habit of prematurely revising their -work and use tools with functionality similar to this to prevent it. -It uses +command line that allows a user to write blindly into a text file but +displaying only written lines. Some writers have the habit of prematurely +revising their work and use tools with functionality similar to this to prevent +it. It uses .BR mm (1) to pipe the output of the program to both the standard error and the regular file writing.txt: diff --git a/docs/rpn.1 b/docs/rpn.1 index 8c8cd84..2386c70 100644 --- a/docs/rpn.1 +++ b/docs/rpn.1 @@ -50,17 +50,17 @@ with the .I IEEE Standard for Floating Point Arithmetic (\fIIEEE 754\fP), floating-point arithmetic has rounding errors. This is somewhat curbed by using the machine epsilon as provided by the Rust standard -library to which numbers are rounded. Because of this, variation is expected in -the number of decimal places the program can handle based on the platform and -hardware of any given machine. +library, to which numbers are rounded. Because of this, variation is expected +in the number of decimal places the program can handle based on the platform +and hardware of any given machine. .\" .SH RATIONALE An infix notation calculation utility, .BR bc (1p), -is included in the POSIX standard, but does not accept expressions as arguments; -in scripts, any predefined, non-interactive input must be piped into the -program. A +is included in the \*(Px standard, but does not accept expressions as +arguments; in scripts, any predefined, non-interactive input must be piped into +the program. A .BR dc (1) pre-dates the standardized .BR bc (1p), @@ -76,7 +76,7 @@ Written by Emma Tebibyte .\" .SH COPYRIGHT -Copyright (c) 2024 Emma Tebibyte. License AGPLv3+: GNU AGPL version 3 or later +Copyright \(co 2024 Emma Tebibyte. License AGPLv3+: GNU AGPL version 3 or later . .\" .SH SEE ALSO diff --git a/docs/str.1 b/docs/str.1 index 1a4d8e4..2258671 100644 --- a/docs/str.1 +++ b/docs/str.1 @@ -17,14 +17,15 @@ str Test the character types of string arguments. -The tests in this program are equivalent to the functions with the same names in +The tests in this program are equivalent to the functions with the same names +in .BR ctype.h (0p) and are the methods by which string arguments are tested. .\" .SH DIAGNOSTICS -If all tests pass, the program will exit successfully. If any of the tests fail, -the program will exit unsuccessfully with an error code of 1. +If all tests pass, the program will exit successfully. If any of the tests +fail, the program will exit unsuccessfully with an error code of 1. When invoked incorrectly, a debug message will be printed and the program will exit with the appropriate @@ -33,8 +34,8 @@ error code. .\" .SH CAVEATS -None of an empty string\(cqs contents pass any of the tests, so the program will -exit unsuccessfully if one is specified. +None of an empty string\(cqs contents pass any of the tests, so the program +will exit unsuccessfully if one is specified. There\(cqs no way of knowing which argument failed the test without re-testing arguments individually. diff --git a/docs/strcmp.1 b/docs/strcmp.1 index db6d3e8..5fd2ece 100644 --- a/docs/strcmp.1 +++ b/docs/strcmp.1 @@ -50,8 +50,8 @@ visual similarity and not byte similarity. The traditional tool for string comparisons in POSIX and other Unix shells has been .BR test (1). -This tool also handles integer comparisons and file scrutiny. These parts of its -functionality have been broken out into multiple utilities. +This tool also handles integer comparisons and file scrutiny. These parts of +its functionality have been broken out into multiple utilities. This program\(cqs functionality may be performed on a POSIX-compliant system with diff --git a/include/FreeBSD.mk b/include/FreeBSD.mk index 8d679b4..9044e55 100644 --- a/include/FreeBSD.mk +++ b/include/FreeBSD.mk @@ -2,5 +2,5 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. diff --git a/include/OpenBSD.mk b/include/OpenBSD.mk index 9624629..bbe7cdc 100644 --- a/include/OpenBSD.mk +++ b/include/OpenBSD.mk @@ -2,8 +2,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. OSLIB = build/o/libopenbsd.rlib RUSTFLAGS += --extern openbsd=$(OSLIB) diff --git a/src/dj.c b/src/dj.c index 6d6a117..1945123 100644 --- a/src/dj.c +++ b/src/dj.c @@ -3,15 +3,15 @@ * Copyright (c) 2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. @@ -28,7 +28,8 @@ #include /* close(2), getopt(3), lseek(2), read(2), write(2), * pledge(2), unveil(2), optarg, optind, STDIN_FILENO, * STDOUT_FILENO */ -#include /* S_IRGRP, S_IROTH, S_IRUSR, S_IWGRP, S_IWOTH, S_IWUSR */ +#include /* S_IRGRP, S_IROTH, S_IRUSR, S_IWGRP, S_IWOTH, + * S_IWUSR */ char *program_name = "dj"; @@ -284,7 +285,8 @@ int main(int argc, char *argv[]) { } /* easy seeking */ - if (!fdisstd(io[i].fd) && lseek(io[i].fd, io[i].seek, SEEK_SET) != -1) { + if (!fdisstd(io[i].fd) && lseek(io[i].fd, io[i].seek, SEEK_SET) != -1) + { io[i].seek = 0; } } diff --git a/src/fileis.rs b/src/fileis.rs index b81b624..c6809a8 100644 --- a/src/fileis.rs +++ b/src/fileis.rs @@ -3,15 +3,15 @@ * Copyright (c) 2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. diff --git a/src/fop.rs b/src/fop.rs index 261aba5..e8f2d06 100644 --- a/src/fop.rs +++ b/src/fop.rs @@ -2,15 +2,15 @@ * Copyright (c) 2023–2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. @@ -141,8 +141,8 @@ fn main() -> ExitCode { /* pop trailing newline out if the input did not contain it */ if fields[index].chars().last() != Some('\n') /* no newline */ && replace.pop() != Some(b'\n') { /* pop last char of replacement */ - /* restore replacement to original command output if popped char was not - * a newline */ + /* restore replacement to original command output if popped char was + * not a newline */ replace = output.stdout; } diff --git a/src/hru.rs b/src/hru.rs index 153032b..b8b1c0b 100644 --- a/src/hru.rs +++ b/src/hru.rs @@ -2,15 +2,15 @@ * Copyright (c) 2023–2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. diff --git a/src/intcmp.rs b/src/intcmp.rs index 5f8f64e..151427a 100644 --- a/src/intcmp.rs +++ b/src/intcmp.rs @@ -3,15 +3,15 @@ * Copyright (c) 2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. diff --git a/src/libgetopt.rs b/src/libgetopt.rs index 8064c81..e4794f7 100644 --- a/src/libgetopt.rs +++ b/src/libgetopt.rs @@ -2,15 +2,15 @@ * Copyright (c) 2023–2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. @@ -107,8 +107,8 @@ impl GetOpt for Vec { * * A ('?') shall be returned if getopt() * encounters an option character not in optstring or detects a - * missing argument and the first character of optstring was not - * a (':'). + * missing argument and the first character of optstring was + * not a (':'). * * Otherwise, getopt() shall return -1 when all command line * options are parsed. */ diff --git a/src/libopenbsd.rs b/src/libopenbsd.rs index 2557dd8..d0e4f07 100644 --- a/src/libopenbsd.rs +++ b/src/libopenbsd.rs @@ -2,15 +2,15 @@ * Copyright (c) 2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. diff --git a/src/libstrerror.rs b/src/libstrerror.rs index e306e7a..ea39f5b 100644 --- a/src/libstrerror.rs +++ b/src/libstrerror.rs @@ -4,7 +4,8 @@ * * Copying and distribution of this file, with or without modification, are * permitted in any medium without royalty provided the copyright notice and - * this notice are preserved. This file is offered as-is, without any warranty. + * this notice are preserved. This file is offered as-is, without any + * warranty. */ use std::ffi::{ c_int, c_char, CStr }; diff --git a/src/mm.rs b/src/mm.rs index 700082e..9ad4cb8 100644 --- a/src/mm.rs +++ b/src/mm.rs @@ -3,15 +3,15 @@ * Copyright (c) 2024 DTB * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. @@ -20,8 +20,7 @@ use std::{ env::args, fs::File, - io::{ Error, BufWriter, Read, Write, stderr, stdin, stdout }, - os::fd::{ AsRawFd, FromRawFd }, + io::{ Error, Read, Write, stderr, stdin, stdout }, process::{ ExitCode, exit}, }; @@ -53,7 +52,7 @@ fn err(argv0: &String, e: Error, code: Option) -> ExitCode { } fn usage(argv0: &String) -> ExitCode { - eprintln!("Usage: {} [-aetu] [-i input] [-o output]", argv0); + eprintln!("Usage: {} [-aet] [-i input] [-o output]", argv0); ExitCode::from(EX_USAGE) } @@ -70,9 +69,8 @@ fn main() -> ExitCode { let mut a = false; /* append to the file */ let mut e = false; /* use stderr as an output */ let mut t = true; /* do not truncate the file before writing */ - let mut u = false; /* unbuffer i/o */ - let mut ins = Vec::new(); /* initial input file path vector */ - let mut outs = Vec::new(); /* initial output file path vector */ + let mut ins = Vec::new(); /* initial inputs */ + let mut outs = Vec::new(); /* initial outputs */ let mut mode: Option = None; /* mode set by last-used option */ let mut optind = 0; @@ -80,7 +78,6 @@ fn main() -> ExitCode { match opt.opt() { Ok("a") => a = true, Ok("e") => e = true, - Ok("u") => u = true, Ok("t") => t = false, Ok("i") => { /* add inputs */ let input = opt.arg().unwrap(); @@ -135,7 +132,7 @@ fn main() -> ExitCode { } } - if ins.is_empty() && outs.is_empty() && argv.len() > optind { + if ins.is_empty() && outs.is_empty() && (argv.len() - 1) > optind { return usage(&argv[0]); } @@ -150,24 +147,23 @@ fn main() -> ExitCode { /* if a file is “-”, it is stdin */ if *file == "-" { /* portable way to access stdin as a file */ - return unsafe { File::from_raw_fd(stdin().as_raw_fd()) }; + return Box::new(stdin().lock()) as Box; } match File::open(file) { - Ok(f) => f, + Ok(f) => Box::new(f) as Box, Err(e) => { let _ = err(&(argv[0].clone() + ": " + file), e, None); exit(EX_IOERR.into()); }, } - }).collect::>(); + }).collect::>>(); /* map all path strings to files */ let mut outputs = outs.iter().map(|file| { /* of a file is “-”, it is stdout */ if *file == "-" { - /* portable way to access stdout as a file */ - return unsafe { File::from_raw_fd(stdout().as_raw_fd()) }; + return Box::new(stdout().lock()) as Box; } let options = File::options() @@ -181,30 +177,20 @@ fn main() -> ExitCode { .open(file); match options { - Ok(f) => return f, + Ok(f) => return Box::new(f) as Box, Err(e) => { let _ = err(&(argv[0].clone() + ": " + file), e, None); exit(EX_IOERR.into()); }, }; - }).collect::>(); + }).collect::>>(); /* if -e is specified, use stderr */ if e { /* portable way to access stderr as a file */ - outputs.push(unsafe { File::from_raw_fd(stderr().as_raw_fd()) }); + outputs.push(Box::new(stderr().lock()) as Box); } - let mut outputs = outputs.iter().map(|o| { - if u { - /* unbuffered writing through a buffer of capacity 0 */ - BufWriter::with_capacity(0, o) - } else { - /* theoretically buffered writing */ - BufWriter::new(o) - } - }).collect::>(); - for file in inputs { for byte in file.bytes().map(|b| { b.unwrap_or_else(|e| { @@ -216,13 +202,6 @@ fn main() -> ExitCode { if let Err(e) = out.write(&[byte]) { return err(&argv[0], e, Some(EX_IOERR)); } - - if u { - /* immediately flush the output for -u */ - if let Err(e) = out.flush() { - return err(&argv[0], e, Some(EX_IOERR)); - } - } } } } diff --git a/src/npc.c b/src/npc.c index e00b36e..6a855be 100644 --- a/src/npc.c +++ b/src/npc.c @@ -3,15 +3,15 @@ * Copyright (c) 2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. diff --git a/src/peek.c b/src/peek.c index fb77189..d814c44 100644 --- a/src/peek.c +++ b/src/peek.c @@ -2,15 +2,15 @@ * Copyright (c) 2023–2024 DTB * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. diff --git a/src/rpn.rs b/src/rpn.rs index 4fc15c3..21f4b07 100644 --- a/src/rpn.rs +++ b/src/rpn.rs @@ -2,21 +2,21 @@ * Copyright (c) 2024–2025 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. * - * This file incorporates work covered by the following copyright and permission - * notice: + * This file incorporates work covered by the following copyright and + * permission notice: * * MIT License * @@ -35,11 +35,11 @@ * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - * USE OR OTHER DEALINGS IN THE SOFTWARE. + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ use std::{ diff --git a/src/scrut.c b/src/scrut.c index 2d3c2bf..5776927 100644 --- a/src/scrut.c +++ b/src/scrut.c @@ -3,15 +3,15 @@ * Copyright (c) 2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. diff --git a/src/str.c b/src/str.c index 6d80bff..2ef6790 100644 --- a/src/str.c +++ b/src/str.c @@ -3,15 +3,15 @@ * Copyright (c) 2023 Marceline Cramer * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. diff --git a/src/strcmp.c b/src/strcmp.c index ff2e1ae..453bbd9 100644 --- a/src/strcmp.c +++ b/src/strcmp.c @@ -3,19 +3,20 @@ * Copyright (c) 2023–2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. */ + #include /* fprintf(3), perror(3), stderr */ #include /* EX_OK, EX_OSERR, EX_USAGE */ diff --git a/src/swab.rs b/src/swab.rs index e167230..64e523b 100644 --- a/src/swab.rs +++ b/src/swab.rs @@ -3,15 +3,15 @@ * Copyright (c) 2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. diff --git a/tests/dj.mk b/tests/dj.mk index 2b4ef6b..cbfad67 100755 --- a/tests/dj.mk +++ b/tests/dj.mk @@ -3,8 +3,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PRAGMA: command_comment diff --git a/tests/false.mk b/tests/false.mk index e3d19ae..6da98a8 100755 --- a/tests/false.mk +++ b/tests/false.mk @@ -3,8 +3,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PHONY: false_tests false_tests: false_test false_help diff --git a/tests/fileis.mk b/tests/fileis.mk index 2ec2132..857de18 100755 --- a/tests/fileis.mk +++ b/tests/fileis.mk @@ -3,8 +3,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PRAGMA: command_comment diff --git a/tests/fop.mk b/tests/fop.mk index 230e1c1..ecddec1 100755 --- a/tests/fop.mk +++ b/tests/fop.mk @@ -2,8 +2,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PHONY: fop_tests fop_tests: fop_functionality fop_delimiter fop_help fop_fail diff --git a/tests/hru.mk b/tests/hru.mk index 49d30cd..68334f4 100755 --- a/tests/hru.mk +++ b/tests/hru.mk @@ -2,8 +2,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PHONY: hru_tests hru_tests: hru_help hru_functionality hru_negative hru_regressions diff --git a/tests/intcmp.mk b/tests/intcmp.mk index abcff03..075f1c6 100755 --- a/tests/intcmp.mk +++ b/tests/intcmp.mk @@ -3,8 +3,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PHONY: intcmp_tests intcmp_tests: intcmp_help intcmp_none intcmp_e intcmp_g intcmp_l intcmp_combined diff --git a/tests/mm.mk b/tests/mm.mk index 891dae3..11f83fa 100755 --- a/tests/mm.mk +++ b/tests/mm.mk @@ -2,8 +2,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PHONY: mm_tests mm_tests: mm_args mm_help mm_stderr mm_remaining mm_remaining_options diff --git a/tests/npc.mk b/tests/npc.mk index 8de71af..4baf029 100755 --- a/tests/npc.mk +++ b/tests/npc.mk @@ -4,8 +4,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PRAGMA: command_comment diff --git a/tests/peek.mk b/tests/peek.mk index 20e2e24..815b711 100755 --- a/tests/peek.mk +++ b/tests/peek.mk @@ -2,8 +2,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. # Testing peek is hard as it requires visual confirmation that text isn't being # echoed. These tests don't go that far but are a start, and have already diff --git a/tests/rpn.mk b/tests/rpn.mk index 297295c..e47f82b 100755 --- a/tests/rpn.mk +++ b/tests/rpn.mk @@ -2,8 +2,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PHONY: rpn_tests rpn_tests: rpn_help rpn_add rpn_sub rpn_mul rpn_div rpn_mod rpn_flr rpn_stdin diff --git a/tests/str.mk b/tests/str.mk index 38ad9ca..6f2946c 100755 --- a/tests/str.mk +++ b/tests/str.mk @@ -2,8 +2,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PRAGMA: command_comment diff --git a/tests/strcmp.mk b/tests/strcmp.mk index c395ca3..57bf076 100755 --- a/tests/strcmp.mk +++ b/tests/strcmp.mk @@ -3,8 +3,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. NAME = strcmp TARGET = $(NAME)_tests diff --git a/tests/swab.mk b/tests/swab.mk index ff64c17..f8564b7 100755 --- a/tests/swab.mk +++ b/tests/swab.mk @@ -2,8 +2,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PRAGMA: command_comment diff --git a/tests/true.mk b/tests/true.mk index fb6e82c..2206e7c 100755 --- a/tests/true.mk +++ b/tests/true.mk @@ -4,8 +4,8 @@ # SPDX-License-Identifier: FSFAP # # Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice and this -# notice are preserved. This file is offered as-is, without any warranty. +# permitted in any medium without royalty provided the copyright notice and +# this notice are preserved. This file is offered as-is, without any warranty. .PHONY: true_tests true_tests: true_test