empserver/src/lib/common/stmtch.c
Markus Armbruster 9f25de3dce Change comment style to use @foo rather than FOO
... when referring to a function's parameter or a struct/union's
member.

The idea of using FOO comes from the GNU coding standards:

    The comment on a function is much clearer if you use the argument
    names to speak about the argument values.  The variable name
    itself should be lower case, but write it in upper case when you
    are speaking about the value rather than the variable itself.
    Thus, "the inode number NODE_NUM" rather than "an inode".

Upcasing names is problematic for a case-sensitive language like C,
because it can create ambiguity.  Moreover, it's too much shouting for
my taste.

GTK-Doc's convention to prefix the identifier with @ makes references
to variables stand out nicely.  The rest of the GTK-Doc conventions
make no sense for us, however.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
2015-12-05 12:13:17 +01:00

96 lines
2.6 KiB
C

/*
* Empire - A multi-player, client/server Internet based war game.
* Copyright (C) 1986-2015, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
* See files README, COPYING and CREDITS in the root of the source
* tree for related information and legal notices. It is expected
* that future projects/authors will amend these files as needed.
*
* ---
*
* stmtch.c: Matching operations on structures and commands
*
* Known contributors to this file:
* Markus Armbruster, 2004-2010
*/
#include <config.h>
#include "match.h"
/*
* Find element named @needle in array @haystack[], return its index.
* Return M_NOTFOUND if there are no matches, M_NOTUNIQUE if there are
* several.
* Each array element has a pointer to its name stored at offset @offs.
* Search stops when this name is a null pointer.
* It ignores elements with an empty name.
* @needle is compared to element names with mineq(@needle, NAME).
* @size gives the size of an array element.
*/
int
stmtch(char *needle, void *haystack, ptrdiff_t offs, size_t size)
{
int i, res;
char *name;
res = M_NOTFOUND;
for (i = 0;; i++) {
name = *(char **)((char *)haystack + i * size + offs);
if (!name)
break;
if (!*name)
continue;
switch (mineq(needle, name)) {
case ME_MISMATCH:
break;
case ME_PARTIAL:
if (res == M_NOTFOUND)
res = i;
else
res = M_NOTUNIQUE;
break;
case ME_EXACT:
return i;
}
}
return res;
}
/*
* Compare @a with @b.
* Return ME_EXACT if they are the same, or @a is a prefix of @b
* followed by a space in @b.
* Return ME_PARTIAL if @a is a prefix of @b not followed by a space.
* Else return ME_MISMATCH.
*/
int
mineq(char *a, char *b)
{
int i;
/* find common prefix: */
for (i = 0; a[i] != 0 && a[i] == b[i]; i++) ;
if (a[i] != 0)
return ME_MISMATCH;
if (b[i] == 0 || b[i] == ' ')
return ME_EXACT;
return ME_PARTIAL;
}