diff options
author | Ian C <ianc@noddybox.co.uk> | 2016-03-07 15:00:21 +0000 |
---|---|---|
committer | Ian C <ianc@noddybox.co.uk> | 2016-03-07 15:00:21 +0000 |
commit | 77e8708934c5c792b1435fa11dfe3c0a6f636a8c (patch) | |
tree | 8c68ecddaf2c2c0730ba310b8d1b9e0f1bd16132 /src/cmd.h | |
parent | 6e9c9c9205d6eec1ff1cfb3fa407c6714854145a (diff) |
Updated README and copied latest version in.
Diffstat (limited to 'src/cmd.h')
-rw-r--r-- | src/cmd.h | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/cmd.h b/src/cmd.h new file mode 100644 index 0000000..b47b1b2 --- /dev/null +++ b/src/cmd.h @@ -0,0 +1,155 @@ +/* + + casm - Simple, portable assembler + + Copyright (C) 2003-2015 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program 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/>. + + ------------------------------------------------------------------------- + + Command callback definitions + +*/ + +#ifndef CASM_CMD_H +#define CASM_CMD_H + +/* ---------------------------------------- TYPES +*/ + + +typedef enum +{ + CMD_OK, + CMD_OK_WARNING, + CMD_FAILED, + CMD_NOT_KNOWN +} CommandStatus; + +/* Used to implement a command. +*/ +typedef CommandStatus (*Command)(const char *label, int argc, char *argv[], + int quoted[], char *err, size_t errsize); + + +/* ---------------------------------------- HELPER MACROS +*/ + + +/* Check for the precesence of a label. Expects a variable called 'label' + + Args: + NONE + + Expects: + + argv - The argv passed to the command handler + label - The label passed to the command handler + err - The error location passed to the command handler + errsize - The size of the error location passed to the command handler +*/ +#define CMD_LABEL_CHECK \ +do \ +{ \ + if (!label) \ + { \ + snprintf(err, errsize, "%s: missing label", argv[0]); \ + return CMD_FAILED; \ + } \ +} while(0) + + + +/* Check for the arg count being at least a specified number. + + Args: + min - The minimum number of arguments to support + + Expects: + + argc - The argc passed to the command handler + argv - The argv passed to the command handler + err - The error location passed to the command handler + errsize - The size of the error location passed to the command handler +*/ +#define CMD_ARGC_CHECK(min) \ +do \ +{ \ + if (argc < min) \ + { \ + snprintf(err, errsize, "%s: missing argument", argv[0]); \ + return CMD_FAILED; \ + } \ +} while(0) + + + + +/* Evaluate an expression. + + Args: + expr - The expression to evaluate + result - The variable to hold the result + + Expects: + + argc - The argc passed to the command handler + argv - The argv passed to the command handler + err - The error location passed to the command handler + errsize - The size of the error location passed to the command handler +*/ +#define CMD_EXPR(expr, result) \ +do \ +{ \ + if (!ExprEval(expr, &result)) \ + { \ + snprintf(err, errsize, "%s: expression error: %s", \ + argv[0], ExprError()); \ + return CMD_FAILED; \ + } \ +} while(0) + + + +/* Parse a table using ParseTable() + + Args: + str - The string to look for + table - The table to parse + result - Variable to hold the return from ParseTable() + + Expects: + + argv - The argv passed to the command handler + err - The error location passed to the command handler + errsize - The size of the error location passed to the command handler +*/ +#define CMD_TABLE(str, table, result) \ +do \ +{ \ + if (!(result = ParseTable(str, table))) \ + { \ + snprintf(err, errsize, "unknown value: \"%s\"", str); \ + return CMD_FAILED; \ + } \ +} while(0) + + + +#endif + +/* +vim: ai sw=4 ts=8 expandtab +*/ |