From f786bd01d9319a93a1fbd42f0678285fc2854fdd Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Sun, 21 Aug 2022 12:39:02 +0100 Subject: [PATCH] add em_message and em_error as variadic variant of elisp message and error --- src/utils.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils.h | 35 +++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/utils.c create mode 100644 src/utils.h diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..5787009 --- /dev/null +++ b/src/utils.c @@ -0,0 +1,74 @@ +/* + * Feynman -- Wayland compositor for GNU Emacs + * + * Copyright (c) 2022 Sameer Rahmani + * + * 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, version 2. + * + * 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 . + */ + +#include "utils.h" + +#include + +void +em_message (emacs_env *env, const char *fmt, ...) +{ + char *internalfmt = NULL; + char buffer[4096]; + va_list args; + va_start (args, fmt); + int rc = vsnprintf (buffer, sizeof (buffer), fmt, args); + va_end (args); + + if (rc < 0) + { + em_error (env, "Variadic params failed on 'em_message'"); + return; + } + + sprintf (internalfmt, "[Feynman]: %s", fmt); + emacs_value message = env->intern (env, "message"); + emacs_value msg = env->make_string (env, internalfmt, strlen (internalfmt)); + // emacs_value msgstr = env->make_string (env, , strlen (msg)); + + emacs_value message_args[] = { msg }; + env->funcall (env, message, 2, message_args); +}; + +void +em_error (emacs_env *env, const char *fmt, ...) +{ + char *internalfmt = NULL; + emacs_value error = env->intern (env, "error"); + + char buffer[4096]; + va_list args; + va_start (args, fmt); + int rc = vsnprintf (buffer, sizeof (buffer), fmt, args); + va_end (args); + + if (rc < 0) + { + char *err_msg = "Variadic params failed on 'em_error'"; + emacs_value msg = env->make_string (env, err_msg, strlen (err_msg)); + emacs_value err_args[] = { msg }; + env->funcall (env, error, 1, err_args); + return; + } + + sprintf (internalfmt, "[Feynman][Error]: %s", fmt); + emacs_value msg = env->make_string (env, internalfmt, strlen (internalfmt)); + + emacs_value error_args[] = { msg }; + env->funcall (env, error, 2, error_args); +}; diff --git a/src/utils.h b/src/utils.h new file mode 100644 index 0000000..68841c5 --- /dev/null +++ b/src/utils.h @@ -0,0 +1,35 @@ +/* + * Feynman -- Wayland compositor for GNU Emacs + * + * Copyright (c) 2022 Sameer Rahmani + * + * 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, version 2. + * + * 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 . + */ + +#ifndef FEYNMAN_UTILS_H +#define FEYNMAN_UTILS_H + +#include +#include +#include + +// Since free and malloc are provided by emacs already +void free (void *); +void *malloc (unsigned long); +void *calloc (unsigned long, unsigned long); +int setenv (const char *envname, const char *envval, int overwrite); + +void em_message (emacs_env *env, const char *fmt, ...); +void em_error (emacs_env *env, const char *fmt, ...); + +#endif