/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
- * Ken Stevens, Steve McClure
+ * Copyright (C) 1986-2021, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Ken Stevens, Steve McClure, Markus Armbruster
*
- * This program is free software; you can redistribute it and/or modify
+ * 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 2 of the License, or
+ * 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,
* 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
- * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- * related information and legal notices. It is expected that any future
- * projects/authors will amend these files as needed.
+ * 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.
*
* ---
*
* mtch.c: Matching operations on structures and commands.
- *
+ *
* Known contributors to this file:
- * (List known contributors to this file)
- */
-/*
- * XXX These routines gamble that structures are all longword-aligned.
- * If this is not true, they will BREAK!
+ * Markus Armbruster, 2004-2009
*/
-#include "misc.h"
-#include "player.h"
+#include <config.h>
+
#include "com.h"
#include "match.h"
#include "prototypes.h"
/*
- * find a matching integer from a member of a structure.
- * Inspired by stmtch above.
- */
-int
-intmatch(register int value, register int *ptr, int size)
-{
- register int i;
-
- size /= sizeof(*ptr);
- for (i = 0; *ptr; i++, ptr += size)
- if (value == *ptr)
- return i;
- return -1;
-}
-
-/*
- * find a matching command from coms[]. Return status is:
- * >= 0: match found, value is array entry in coms[]
+ * Search for @command in @coms[], return its index.
+ * Return M_NOTFOUND if there are no matches, M_NOTUNIQUE if there are
+ * several, M_IGNORE if the command should be ignored.
+ * Ignore commands that require more permissions than @comstat.
*/
int
-comtch(register s_char *command, struct cmndstr *coms, int comstat,
- int god)
+comtch(char *command, struct cmndstr *coms, int comstat)
{
- register struct cmndstr *com;
- register int status;
- register int i;
+ struct cmndstr *com;
+ int status;
- if (command == 0 || *command == 0)
+ if (!command || !*command)
return M_IGNORE;
status = M_NOTFOUND;
- for (com = coms; com->c_form != 0; com++) {
- if ((com->c_permit & comstat) != com->c_permit && !god)
- continue;
- if ((i = mineq(command, com->c_form)) == ME_MISMATCH)
+ for (com = coms; com->c_form; com++) {
+ if ((com->c_permit & comstat) != com->c_permit)
continue;
- if (i == ME_EXACT)
+ switch (mineq(command, com->c_form)) {
+ case ME_MISMATCH:
+ break;
+ case ME_PARTIAL:
+ if (status >= 0)
+ return M_NOTUNIQUE;
+ status = com - coms;
+ break;
+ case ME_EXACT:
return com - coms;
- /* partial */
- if (status != M_NOTFOUND)
- return M_NOTUNIQUE;
- status = com - coms;
+ }
}
return status;