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; }