src/helper: wrap and clean headers.
[openocd.git] / src / helper / command.h
index 5fc0a283ea6b1a403ef73816db8c6715eec12f99..70b00c3292de41b8b7bd3152e348227a6bc528e6 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -23,6 +23,8 @@
 #ifndef COMMAND_H
 #define COMMAND_H
 
+#include "types.h"
+
 /* Integrate the JIM TCL interpretor into the command processing. */
 #if BUILD_ECOSBOARD
 #include <stdio.h>
 /* Jim is provied by eCos */
 #include <cyg/jimtcl/jim.h>
 #else
-#define JIM_EMBEDDED
 #include "jim.h"
 #endif
 
+/* To achieve C99 printf compatibility in MinGW, gnu_printf should be
+ * used for __attribute__((format( ... ))), with GCC v4.4 or later
+ */
+#if (defined(IS_MINGW) && (((__GNUC__ << 16) + __GNUC_MINOR__) >= 0x00040004))
+#define PRINTF_ATTRIBUTE_FORMAT gnu_printf
+#else
+#define PRINTF_ATTRIBUTE_FORMAT printf
+#endif
+
 enum command_mode
 {
        COMMAND_EXEC,
@@ -74,25 +84,43 @@ typedef struct command_s
        struct command_s *next;
 } command_t;
 
-extern command_t* register_command(command_context_t *context, command_t *parent, char *name, int (*handler)(struct command_context_s *context, char* name, char** args, int argc), enum command_mode mode, char *help);
-extern int unregister_command(command_context_t *context, char *name);
-extern int unregister_all_commands(command_context_t *context);
-extern void command_set_output_handler(command_context_t* context, int (*output_handler)(struct command_context_s *context, const char* line), void *priv);
-extern command_context_t* copy_command_context(command_context_t* context);
-extern int command_context_mode(command_context_t *context, enum command_mode mode);
-extern command_context_t* command_init(void);
-extern int command_done(command_context_t *context);
-extern void command_print(command_context_t *context, char *format, ...);
-extern void command_print_sameline(command_context_t *context, char *format, ...);
-extern int command_run_line(command_context_t *context, char *line);
-extern int command_run_linef(command_context_t *context, char *format, ...);
-extern void command_output_text(command_context_t *context, const char *data);
-
-extern void process_jim_events(void);
+command_t* register_command(command_context_t *context,
+               command_t *parent, char *name,
+               int (*handler)(struct command_context_s *context,
+                               char* name, char** args, int argc),
+               enum command_mode mode, char *help);
+
+int unregister_command(command_context_t *context, char *name);
+int unregister_all_commands(command_context_t *context);
+
+void command_set_output_handler(command_context_t* context,
+               int (*output_handler)(struct command_context_s *context,
+               const char* line), void *priv);
+
+command_context_t* copy_command_context(command_context_t* context);
+
+int command_context_mode(command_context_t *context, enum command_mode mode);
+
+command_context_t* command_init(void);
+int command_done(command_context_t *context);
+
+void command_print(command_context_t *context, const char *format, ...)
+               __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3)));
+void command_print_sameline(command_context_t *context, const char *format, ...)
+               __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3)));
+int command_run_line(command_context_t *context, char *line);
+int command_run_linef(command_context_t *context, const char *format, ...)
+               __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3)));
+void command_output_text(command_context_t *context, const char *data);
+
+void process_jim_events(void);
 
 #define                ERROR_COMMAND_CLOSE_CONNECTION          (-600)
 #define                ERROR_COMMAND_SYNTAX_ERROR                      (-601)
 #define                ERROR_COMMAND_NOTFOUND                          (-602)
+#define                ERROR_COMMAND_ARGUMENT_INVALID          (-603)
+#define                ERROR_COMMAND_ARGUMENT_OVERFLOW         (-604)
+#define                ERROR_COMMAND_ARGUMENT_UNDERFLOW        (-605)
 
 extern int fast_and_dangerous;
 
@@ -102,4 +130,46 @@ void register_jim(command_context_t *context, const char *name, int (*cmd)(Jim_I
 
 long jim_global_long(const char *variable);
 
+int parse_ulong(const char *str, unsigned long *ul);
+int parse_ullong(const char *str, unsigned long long *ul);
+
+int parse_long(const char *str, long *ul);
+int parse_llong(const char *str, long long *ul);
+
+#define DECLARE_PARSE_WRAPPER(name, type) \
+       int parse##name(const char *str, type *ul)
+
+DECLARE_PARSE_WRAPPER(_uint, unsigned);
+DECLARE_PARSE_WRAPPER(_u32, uint32_t);
+DECLARE_PARSE_WRAPPER(_u16, uint16_t);
+DECLARE_PARSE_WRAPPER(_u8, uint8_t);
+
+DECLARE_PARSE_WRAPPER(_int, int);
+DECLARE_PARSE_WRAPPER(_s32, int32_t);
+DECLARE_PARSE_WRAPPER(_s16, int16_t);
+DECLARE_PARSE_WRAPPER(_s8, int8_t);
+
+/**
+ * @brief parses the string @a in into @a out as a @a type, or prints
+ * a command error and passes the error code to the caller.  If an error
+ * does occur, the calling function will return the error code produced
+ * by the parsing function (one of ERROR_COMMAND_ARGUMENT_*).
+ *
+ * This function may cause the calling function to return immediately,
+ * so it should be used carefully to avoid leaking resources.  In most
+ * situations, parsing should be completed in full before proceding
+ * to allocate resources, and this strategy will most prevents leaks.
+ */
+#define COMMAND_PARSE_NUMBER(type, in, out) \
+       do { \
+               int retval = parse_##type(in, &(out)); \
+               if (ERROR_OK != retval) { \
+                       command_print(cmd_ctx, stringify(out) \
+                               " option value ('%s') is not valid", in); \
+                       return retval; \
+               } \
+       } while (0)
+
+void script_debug(Jim_Interp *interp, const char *cmd, int argc, Jim_Obj *const *argv);
+
 #endif /* COMMAND_H */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)