all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* C Hello World Emacs module
@ 2021-10-05 10:07 Emanuel Berg via Users list for the GNU Emacs text editor
  2021-10-05 10:37 ` Omar Polo
  2021-10-06  7:35 ` Christian Barthel
  0 siblings, 2 replies; 7+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-10-05 10:07 UTC (permalink / raw)
  To: help-gnu-emacs

Can one write a Hello World program in C, compile it, and
bring it in and have it `message' and/or `insert' that string
in Emacs?

Is there a minimal working example, in the LaTeX lingo, for
C modules in Emacs?

-- 
underground experts united
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: C Hello World Emacs module
  2021-10-05 10:07 C Hello World Emacs module Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-10-05 10:37 ` Omar Polo
  2021-10-05 11:15   ` Emanuel Berg via Users list for the GNU Emacs text editor
  2021-10-06  7:35 ` Christian Barthel
  1 sibling, 1 reply; 7+ messages in thread
From: Omar Polo @ 2021-10-05 10:37 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> writes:

> Can one write a Hello World program in C, compile it, and
> bring it in and have it `message' and/or `insert' that string
> in Emacs?
>
> Is there a minimal working example, in the LaTeX lingo, for
> C modules in Emacs?

Other than in the manual, I've found this article by skeeto to be really
helpful in understanding how modules works:

https://nullprogram.com/blog/2016/11/05/

The first bit of code is how to call `message' with "Hello, world!" as
argument.

HTH



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: C Hello World Emacs module
  2021-10-05 10:37 ` Omar Polo
@ 2021-10-05 11:15   ` Emanuel Berg via Users list for the GNU Emacs text editor
  2021-10-05 11:26     ` Omar Polo
  0 siblings, 1 reply; 7+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-10-05 11:15 UTC (permalink / raw)
  To: help-gnu-emacs

Omar Polo wrote:

>> Is there a minimal working example, in the LaTeX lingo, for
>> C modules in Emacs?
>
> Other than in the manual, I've found this article by skeeto
> to be really helpful in understanding how modules works:
>
> https://nullprogram.com/blog/2016/11/05/
>
> The first bit of code is how to call `message' with "Hello,
> world!" as argument.

OK, thanks, that one step closer, there's this

  #include "emacs-module.h"

  int plugin_is_GPL_compatible;

  int emacs_module_init(struct emacs_runtime *ert) {
    emacs_env *env = ert->get_environment(ert);
    emacs_value message = env->intern(env, "message");
    const char hi[] = "Hello, world!";
    emacs_value string = env->make_string(env, hi, sizeof(hi) - 1);
    env->funcall(env, message, 1, &string);
    return 0;
  }

  In a real module, it’s common to create function objects for
  native functions, then fetch the fset symbol and make a Lisp
  call on it to bind the newly-created function object to
  a name. You’ll see this in action later.

But still missing is the command(s) and options to compile and
instructions how to make it visible from Emacs ...

Also I'd like to have the example as it would look "[i]n
a real module" ... so it shouldn't just be a MWE, it should be
a MCAWE (Minimal Correct and Applicable Working Example)

:)

-- 
underground experts united
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: C Hello World Emacs module
  2021-10-05 11:15   ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-10-05 11:26     ` Omar Polo
  2021-10-05 11:47       ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 1 reply; 7+ messages in thread
From: Omar Polo @ 2021-10-05 11:26 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> writes:

> Omar Polo wrote:
>
>>> Is there a minimal working example, in the LaTeX lingo, for
>>> C modules in Emacs?
>>
>> Other than in the manual, I've found this article by skeeto
>> to be really helpful in understanding how modules works:
>>
>> https://nullprogram.com/blog/2016/11/05/
>>
>> The first bit of code is how to call `message' with "Hello,
>> world!" as argument.
>
> OK, thanks, that one step closer, there's this
>
>   #include "emacs-module.h"
>
>   int plugin_is_GPL_compatible;
>
>   int emacs_module_init(struct emacs_runtime *ert) {
>     emacs_env *env = ert->get_environment(ert);
>     emacs_value message = env->intern(env, "message");
>     const char hi[] = "Hello, world!";
>     emacs_value string = env->make_string(env, hi, sizeof(hi) - 1);
>     env->funcall(env, message, 1, &string);
>     return 0;
>   }
>
>   In a real module, it’s common to create function objects for
>   native functions, then fetch the fset symbol and make a Lisp
>   call on it to bind the newly-created function object to
>   a name. You’ll see this in action later.
>
> But still missing is the command(s) and options to compile and
> instructions how to make it visible from Emacs ...
>
> Also I'd like to have the example as it would look "[i]n
> a real module" ... so it shouldn't just be a MWE, it should be
> a MCAWE (Minimal Correct and Applicable Working Example)
>
> :)

There's a Makefile linked in the article, which even if it has a .POSIX
target is just a GNU Makefile, but anyway.

https://github.com/skeeto/joymacs/blob/master/Makefile

Assuming you're on some UNIX flavors, you need to create a shared
library.  This means that you need to compile every object file with
-fPIC and then bundle 'em together with something like

	cc -shared -fPIC -o your-module.so obj1.o obj2.o obj3.o ...

(where obj1.o, obj2.o etc are your compiled C files, for e.g.
	cc -fPIC -c obj1.c -o obj1.o
)

To load it, IIRC is mentioned in the manual, you just drop the .so file
inside `load-path' and `require' it like it were a .el/.elc file.

How structure it heavily depends on what you want to do.  Usually one
wants to export some functions from C to elisp, but you may want to do
something else.

In the linked article the first snippet (the one you quoted) shows how
to translate (message "Hello, world!") in a C module, later examples
shows how to make functions callable from elisp.

Another example is emacs-libpq, the bindings for the postgresql
library.  It is of course CAWE (correct and applicable working example),
don't know if I would consider it minimal thought.

https://github.com/anse1/emacs-libpq/blob/master/pq-core.c#L354

They define a handy DEFUN macro to prettify the process of registering
functions.

In the end, how to do it heavily depends how what you want to do ;)



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: C Hello World Emacs module
  2021-10-05 11:26     ` Omar Polo
@ 2021-10-05 11:47       ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 0 replies; 7+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-10-05 11:47 UTC (permalink / raw)
  To: help-gnu-emacs

Omar Polo wrote:

> There's a Makefile linked in the article, which even if it
> has a .POSIX target is just a GNU Makefile, but anyway.
>
> https://github.com/skeeto/joymacs/blob/master/Makefile
>
> Assuming you're on some UNIX flavors, you need to create
> a shared library. This means that you need to compile every
> object file with -fPIC and then bundle 'em together with
> something like

Yes, I'm on Debian 11!

Thanks a lot, will get back to you with questions/results
later Gw ...

-- 
underground experts united
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: C Hello World Emacs module
  2021-10-05 10:07 C Hello World Emacs module Emanuel Berg via Users list for the GNU Emacs text editor
  2021-10-05 10:37 ` Omar Polo
@ 2021-10-06  7:35 ` Christian Barthel
  2021-11-06 13:05   ` Emanuel Berg via Users list for the GNU Emacs text editor
  1 sibling, 1 reply; 7+ messages in thread
From: Christian Barthel @ 2021-10-06  7:35 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs

On Tue, Oct 05 2021, Emanuel Berg via Users list for the GNU Emacs text editor wrote:

> Can one write a Hello World program in C, compile it, and
> bring it in and have it `message' and/or `insert' that string
> in Emacs?
>
> Is there a minimal working example, in the LaTeX lingo, for
> C modules in Emacs?

You might want to have a look at this:
  <http://diobla.info/blog-archive/modules-tut.html>

As far as I can remember, I followed those instructions when
writing a C module.

-- 
Christian Barthel



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: C Hello World Emacs module
  2021-10-06  7:35 ` Christian Barthel
@ 2021-11-06 13:05   ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 0 replies; 7+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-11-06 13:05 UTC (permalink / raw)
  To: help-gnu-emacs

Emacs Dynamic Module example with all the fixings:

  https://dataswamp.org/~incal/emacs-init/more/dm/

Here's the C. Follow the hyperlink for the Makefile,
header file, and Elisp.

#include "dm.h"

#include <emacs-module.h>
#include <stdio.h>

int plugin_is_GPL_compatible;

int emacs_module_init(struct emacs_runtime* runtime) {
  if (runtime->size < (long int)sizeof(*runtime)) {
    return 1; // incompatible/mismatch Emacs binary
  }

  emacs_env* env = runtime->get_environment(runtime);
  if (env->size < (long int)sizeof(*env)) {
    return 2; // ditto module API
  }

  int __attribute__((unused)) emacs_version;
  if ((long int)sizeof(struct emacs_env_29) <= env->size) {
    emacs_version = 29;
  }
  else {
    return 3; // too old Emacs
  }

  emacs_value hw_func   = env->make_function(env, 0, 0, hw, NULL, NULL);
  emacs_value hw_symbol = env->intern(env, "hw-func");
  emacs_value args[]    = {hw_symbol, hw_func};
  env->funcall(env, env->intern(env, "defalias"), 2, args);

  return 0;
}

emacs_value hw(emacs_env*   env,
               ptrdiff_t    nargs __attribute__((unused)),
               emacs_value* args  __attribute__((unused)),
               void*        data  __attribute__((unused))) {
  emacs_value str = env->make_string(env, "Dynamic Module Operational", 26);
  return str;
}

-- 
underground experts united
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-11-06 13:05 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-10-05 10:07 C Hello World Emacs module Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-05 10:37 ` Omar Polo
2021-10-05 11:15   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-05 11:26     ` Omar Polo
2021-10-05 11:47       ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-06  7:35 ` Christian Barthel
2021-11-06 13:05   ` Emanuel Berg via Users list for the GNU Emacs text editor

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.