src/helper: wrap and clean headers.
[openocd.git] / src / helper / command.h
index 2b9f1a16230ba7750594defb0063aee246f96b81..70b00c3292de41b8b7bd3152e348227a6bc528e6 100644 (file)
 #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,
@@ -75,25 +84,36 @@ 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, const char *format, ...)
-               __attribute__ ((format (printf, 2, 3)));
-extern void command_print_sameline(command_context_t *context, const char *format, ...)
-               __attribute__ ((format (printf, 2, 3)));
-extern int command_run_line(command_context_t *context, char *line);
-extern int command_run_linef(command_context_t *context, const char *format, ...)
-               __attribute__ ((format (printf, 2, 3)));
-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)
@@ -129,6 +149,27 @@ 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)