diff --git a/docs/strcmp.1 b/docs/strcmp.1
index c99c8c8..db6d3e8 100644
--- a/docs/strcmp.1
+++ b/docs/strcmp.1
@@ -4,7 +4,7 @@
.\" This work is licensed under CC BY-SA 4.0. To see a copy of this license,
.\" visit .
.\"
-.TH STRCMP 1 2024-06-17 "Harakit X.X.X"
+.TH STRCMP 1 2024-07-15 "Harakit X.X.X"
.SH NAME
strcmp \(en compare strings
.\"
@@ -20,15 +20,15 @@ Check whether string arguments are the same.
.SH DIAGNOSTICS
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
-than one of the prior strings:
+will exit with an error code less than 128 if a string passed has a lesser byte
+value than one of the prior strings:
.RS
strcmp b a
.RE
-or with an error code of 255 if it has a greater byte value than one of the
-prior strings:
+or with an error code greater than 128 if it has a greater byte value than one
+of the prior strings:
.RS
strcmp a b
diff --git a/src/strcmp.c b/src/strcmp.c
index 33b73c2..33eab10 100644
--- a/src/strcmp.c
+++ b/src/strcmp.c
@@ -1,24 +1,43 @@
-#include /* fprintf(3), stderr */
-#include /* EXIT_FAILURE */
-#include
+/*
+ * Copyright (c) 2022–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 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 /* fprintf(3), stderr */
+#include /* size_t */
+#include /* EX_USAGE */
+
+char *program_name = "strcmp";
int main(int argc, char *argv[]){
- int i;
-
- if(argc < 3){
+ if (argc < 3) {
fprintf(stderr, "Usage: %s string string...\n",
- argv[0] == NULL ? program_name : argv[0]);
+ argv[0] == NULL ? program_name : argv[0]
+ );
return EX_USAGE;
}
- for(; *argv[1] != '\0'; ++argv[1])
- for(i = 2; i < argc; ++i)
- if(*argv[i-1] > *argv[i])
- return 1;
- else if(*argv[i-1] < *argv[i]++)
- return -1; /* actually 255 */
+ /* This compares the Nth character of arg[2] onward with argv[1]'s Nth
+ * character, rather than comparing each arg with argv[1] sequentially. */
+ for (; *argv[1] != '\0'; ++argv[1]) { /* iterate chars in argv[1] */
+ for (size_t i = 2; i < argc; ++argv[i], ++i) { /* iterate &argv[2] */
+ /* this never overruns because of nul termination */
+ if (*argv[i-1] != *argv[i]) { return *argv[i-1] - *argv[i]; }
+ }
+ }
return 0;
}