Compare commits
12 Commits
0.13.17
...
16f23e11c0
| Author | SHA1 | Date | |
|---|---|---|---|
|
16f23e11c0
|
|||
|
d87c278be5
|
|||
|
5caefbb465
|
|||
|
8d743dab7a
|
|||
|
9addfc9284
|
|||
|
8f8de5de2b
|
|||
|
0df2c9f566
|
|||
|
b7bc1f16ad
|
|||
|
ca6865688a
|
|||
|
1fd768057c
|
|||
|
35d54d84b0
|
|||
|
a141b95293
|
@@ -4,7 +4,7 @@
|
|||||||
.\" This work is licensed under CC BY-SA 4.0. To see a copy of this license,
|
.\" This work is licensed under CC BY-SA 4.0. To see a copy of this license,
|
||||||
.\" visit <http://creativecommons.org/licenses/by-sa/4.0/>.
|
.\" visit <http://creativecommons.org/licenses/by-sa/4.0/>.
|
||||||
.\"
|
.\"
|
||||||
.TH STRCMP 1 2024-06-17 "Harakit X.X.X"
|
.TH STRCMP 1 2024-07-15 "Harakit X.X.X"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
strcmp \(en compare strings
|
strcmp \(en compare strings
|
||||||
.\"
|
.\"
|
||||||
@@ -20,15 +20,15 @@ Check whether string arguments are the same.
|
|||||||
.SH DIAGNOSTICS
|
.SH DIAGNOSTICS
|
||||||
|
|
||||||
The program will exit successfully if the strings are identical. Otherwise, it
|
The program will exit successfully if the strings are identical. Otherwise, it
|
||||||
will exit with an error code of 1 if a string passed has a lesser byte value
|
will exit with an error code less than 128 if a string passed has a lesser byte
|
||||||
than one of the prior strings:
|
value than one of the prior strings:
|
||||||
|
|
||||||
.RS
|
.RS
|
||||||
strcmp b a
|
strcmp b a
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
or with an error code of 255 if it has a greater byte value than one of the
|
or with an error code greater than 128 if it has a greater byte value than one
|
||||||
prior strings:
|
of the prior strings:
|
||||||
|
|
||||||
.RS
|
.RS
|
||||||
strcmp a b
|
strcmp a b
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ swab \(en swap bytes
|
|||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|
||||||
swab
|
swab
|
||||||
.RB [ -f ]
|
|
||||||
.RB [ -w\ word_size ]
|
.RB [ -w\ word_size ]
|
||||||
.\"
|
.\"
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
@@ -20,8 +19,6 @@ Swap the latter and former halves of a block of bytes.
|
|||||||
.\"
|
.\"
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
|
|
||||||
.IP \fB-f\fP
|
|
||||||
Ignore SIGINT signal.
|
|
||||||
.IP \fB-w\fP\ \fIword_size\fP
|
.IP \fB-w\fP\ \fIword_size\fP
|
||||||
Configures the word size; that is, the size in bytes of the block size on which
|
Configures the word size; that is, the size in bytes of the block size on which
|
||||||
to operate. The default word size is 2. The word size must be cleanly divisible
|
to operate. The default word size is 2. The word size must be cleanly divisible
|
||||||
|
|||||||
9
src/dj.c
9
src/dj.c
@@ -263,12 +263,12 @@ int main(int argc, char *argv[]){
|
|||||||
assert(io[0].bufuse == 0);
|
assert(io[0].bufuse == 0);
|
||||||
|
|
||||||
{ /* read */
|
{ /* read */
|
||||||
char skipping;
|
long skipping;
|
||||||
size_t t;
|
size_t t;
|
||||||
|
|
||||||
/* hack to intentionally get a partial read from Io_read */
|
/* hack to intentionally get a partial read from Io_read */
|
||||||
if((skipping = (io[0].seek > 0)) && io[0].seek < io[0].bs)
|
if((skipping = MIN(io[0].seek, io[0].bs)) > 0)
|
||||||
io[0].bufuse = io[0].bs - io[0].seek;
|
io[0].bufuse = io[0].bs - (size_t)skipping;
|
||||||
|
|
||||||
t = io[0].bufuse;
|
t = io[0].bufuse;
|
||||||
if(Io_read(&io[0])->bufuse == t && !noerror && io[0].error == 0)
|
if(Io_read(&io[0])->bufuse == t && !noerror && io[0].error == 0)
|
||||||
@@ -290,7 +290,8 @@ int main(int argc, char *argv[]){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(skipping){
|
if(skipping > 0){
|
||||||
|
io[0].seek -= skipping;
|
||||||
io[0].bufuse = 0;
|
io[0].bufuse = 0;
|
||||||
count += (count != 0);
|
count += (count != 0);
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
46
src/strcmp.c
46
src/strcmp.c
@@ -1,24 +1,42 @@
|
|||||||
#include <stdio.h> /* fprintf(3), stderr */
|
/*
|
||||||
#include <stdlib.h> /* EXIT_FAILURE */
|
* Copyright (c) 2022–2024 DTB <trinity@trinity.moe>
|
||||||
#include <sysexits.h>
|
* 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 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.
|
||||||
|
*
|
||||||
|
* 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/.
|
||||||
|
*/
|
||||||
|
|
||||||
static char *program_name = "strcmp";
|
#include <stdio.h> /* fprintf(3), stderr */
|
||||||
|
#include <stdlib.h> /* size_t */
|
||||||
|
#include <sysexits.h> /* EX_USAGE */
|
||||||
|
|
||||||
|
static *program_name = "strcmp";
|
||||||
|
|
||||||
int main(int argc, char *argv[]){
|
int main(int argc, char *argv[]){
|
||||||
int i;
|
if (argc < 3) {
|
||||||
|
|
||||||
if(argc < 3){
|
|
||||||
fprintf(stderr, "Usage: %s string string...\n",
|
fprintf(stderr, "Usage: %s string string...\n",
|
||||||
argv[0] == NULL ? program_name : argv[0]);
|
argv[0] == NULL ? program_name : argv[0]
|
||||||
|
);
|
||||||
return EX_USAGE;
|
return EX_USAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(; *argv[1] != '\0'; ++argv[1])
|
for (; *argv[1] != '\0'; ++argv[1]) { /* iterate chars in ref */
|
||||||
for(i = 2; i < argc; ++i)
|
/* iterate argc */
|
||||||
if(*argv[i-1] > *argv[i])
|
for (size_t i = 2 /* ref cmp */; i < argc; ++argv[i], ++i) {
|
||||||
return 1;
|
/* this doesn't overrun because of nul termination */
|
||||||
else if(*argv[i-1] < *argv[i]++)
|
if (*argv[i-1] != *argv[i]) { return *argv[i-1] - *argv[i]; }
|
||||||
return -1; /* actually 255 */
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
24
src/swab.rs
24
src/swab.rs
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2024 DTB <trinity@trinity.moe>
|
* Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||||
|
* Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it under
|
* This program is free software: you can redistribute it and/or modify it under
|
||||||
@@ -18,7 +19,7 @@
|
|||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
env::args,
|
env::args,
|
||||||
io::{ stdin, stdout, Error, ErrorKind, Read, Write },
|
io::{ stdin, stdout, Error, Read, Write },
|
||||||
process::ExitCode,
|
process::ExitCode,
|
||||||
vec::Vec
|
vec::Vec
|
||||||
};
|
};
|
||||||
@@ -38,7 +39,7 @@ fn oserr(s: &str, e: Error) -> ExitCode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn usage(s: &str) -> ExitCode {
|
fn usage(s: &str) -> ExitCode {
|
||||||
eprintln!("Usage: {} [-f] [-w word_size]", s);
|
eprintln!("Usage: {} [-w word_size]", s);
|
||||||
ExitCode::from(EX_USAGE as u8)
|
ExitCode::from(EX_USAGE as u8)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,24 +49,26 @@ fn main() -> ExitCode {
|
|||||||
let mut input = stdin();
|
let mut input = stdin();
|
||||||
let mut output = stdout().lock();
|
let mut output = stdout().lock();
|
||||||
|
|
||||||
let mut force = false;
|
let mut optind: usize = 1; // argv[0]
|
||||||
let mut wordsize: usize = 2;
|
let mut wordsize: usize = 2; // Equivalent to dd(1p).
|
||||||
|
|
||||||
while let Some(opt) = argv.getopt("fw:") {
|
while let Some(opt) = argv.getopt("w:") {
|
||||||
match opt.opt() {
|
match opt.opt() {
|
||||||
Ok("f") => force = true,
|
|
||||||
Ok("w") => {
|
Ok("w") => {
|
||||||
if let Some(arg) = opt.arg() {
|
match opt.arg().unwrap().parse::<usize>() {
|
||||||
match arg.parse::<usize>() {
|
Ok(w) if w % 2 == 0 => { wordsize = w; },
|
||||||
Ok(w) if w % 2 == 0 => { wordsize = w; () },
|
|
||||||
_ => { return usage(&argv[0]); },
|
_ => { return usage(&argv[0]); },
|
||||||
}
|
}
|
||||||
}
|
optind = opt.ind();
|
||||||
},
|
},
|
||||||
_ => { return usage(&argv[0]); }
|
_ => { return usage(&argv[0]); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if optind < argv.len() {
|
||||||
|
return usage(&argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
buf.resize(wordsize, 0);
|
buf.resize(wordsize, 0);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
@@ -83,7 +86,6 @@ fn main() -> ExitCode {
|
|||||||
break oserr(&argv[0], e)
|
break oserr(&argv[0], e)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Err(e) if e.kind() == ErrorKind::Interrupted && force => continue,
|
|
||||||
Err(e) => break oserr(&argv[0], e)
|
Err(e) => break oserr(&argv[0], e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user