From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Yuan Fu Newsgroups: gmane.emacs.bugs Subject: bug#64830: 30.0.50 C++ treesitter mode no coloration Date: Wed, 28 Aug 2024 21:54:26 -0700 Message-ID: References: <86h6bk5nnu.fsf@gnu.org> <3C502C2B-829D-42C3-A74A-2A783F5880CE@gmail.com> <868qwjjhq3.fsf@gnu.org> <78DD1528-A12B-4199-9822-157852080027@gmail.com> <86wmk2i2vp.fsf@gnu.org> <29FFAE70-8B01-47CF-A45A-D01C82C56247@gmail.com> <86wmk0hlnr.fsf@gnu.org> Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_9859E5A0-532E-402E-BB00-A4685E688A7B" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="11666"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 64830@debbugs.gnu.org, Alan Mackenzie , Stefan Kangas To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Thu Aug 29 06:56:36 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1sjXD1-0002tW-1N for geb-bug-gnu-emacs@m.gmane-mx.org; Thu, 29 Aug 2024 06:56:35 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sjXCb-0001Hk-4j; Thu, 29 Aug 2024 00:56:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sjXCa-0001H6-8C for bug-gnu-emacs@gnu.org; Thu, 29 Aug 2024 00:56:08 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sjXCZ-0001JI-Rh for bug-gnu-emacs@gnu.org; Thu, 29 Aug 2024 00:56:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=References:In-Reply-To:Date:Mime-Version:From:To:Subject; bh=uoqBVz0Qj1TTzMcNJtyaHzNA3vl5wdH7ib2AeYIiQG8=; b=YEpbDHfGEQMtHEHUTdmSBuh35NbeNp6kKaacwm0vt7DrJUMn+yiUmml0to7rZwMxlbt510g7eB7lYwL8CI02bBanhHO7v8i7XFvyuU6QJfVaAbrpQWLT6CeAMi4OVhgNyXIwM52bGIrrs25b7OoHW022al0lkOnsCLmlvjyr31lf5a+SJ2iRdeHzXQSEYtpn60GT7ved6XyE1e+sISfgdgf8x1GKMS4DmhdQdlL6unlBKiKHkArvZAx0vC0uewATwfES2hAmrAWf9FbmbrW6AY8ELiWh6/al8kH6z6jaK2Kstnehm5rAvVohTYM5TVgKNF2edGb2N7X32tsg7J94Ow==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1sjXDR-0000gD-MS for bug-gnu-emacs@gnu.org; Thu, 29 Aug 2024 00:57:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Yuan Fu Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 29 Aug 2024 04:57:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 64830 X-GNU-PR-Package: emacs Original-Received: via spool by 64830-submit@debbugs.gnu.org id=B64830.17249074022579 (code B ref 64830); Thu, 29 Aug 2024 04:57:01 +0000 Original-Received: (at 64830) by debbugs.gnu.org; 29 Aug 2024 04:56:42 +0000 Original-Received: from localhost ([127.0.0.1]:50081 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sjXD7-0000fW-Kh for submit@debbugs.gnu.org; Thu, 29 Aug 2024 00:56:41 -0400 Original-Received: from mail-oa1-f43.google.com ([209.85.160.43]:52420) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sjXD5-0000fD-37 for 64830@debbugs.gnu.org; Thu, 29 Aug 2024 00:56:40 -0400 Original-Received: by mail-oa1-f43.google.com with SMTP id 586e51a60fabf-27020fca39aso157312fac.0 for <64830@debbugs.gnu.org>; Wed, 28 Aug 2024 21:55:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724907278; x=1725512078; darn=debbugs.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=uoqBVz0Qj1TTzMcNJtyaHzNA3vl5wdH7ib2AeYIiQG8=; b=lAw9uy2MFAqjvc7kbzQMdNghRaUAirzaSFaC4zTEl8wUP5d1Yn3fSuakk+f09Lh3wY bCEzx7lXwBxxYGOHuu2LeZX7AdENugrHF1Cja82G1Oe0lTyzRBIJ3yj0QrwzBBLkEO9j 7AUxapnn/NeLwFBkNAkaqp4R7KoUlqTQoK+HvyHHGmXPJsAO1iAFmQZmuGssAWkZTTsu X3uD3WrtJLWsel0ocjjhAPgmic5u23hypCcuxwUeElNYi0vZdsU0Jy9kv4JrkpDBTdR2 QI7efGVoBJHV2BXAUyj+M8qA55Bzb8zVNob5tU9+0f6Ad1Dg5KDCNEwqhFu2rsFKo8G4 xqHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724907278; x=1725512078; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=uoqBVz0Qj1TTzMcNJtyaHzNA3vl5wdH7ib2AeYIiQG8=; b=oDBvzK+BHOtfiE4gIQgqy/mWnxWCvhsI3CopnsQo2Xf6UMg+VZV8L45j0xO2pKteGT wfmBLmXftSpfDU+agzGjAd+FkvxpcLZtiOdqRt1/TwI28A84Hx02/FlPWQwdIaXwyqNU EHtXfxXJccSMnFBw8LFPuwebSKIlfjMpY6vJSkJ6idMbzs3oPUnwIl96h4d15jSt44Hb 5a1sfL/q+9CZWADVbU4h7l0xXcQ1rOqsiylT4+GtqIuzkxUPNXpum32ZqFIfNHm1dxkx 3lisTqQ15lTA6W8ehGIrmNPkbkB58k2D7E2IOoo47O13SLeBFavSOj1IEhBUbaiylrZF cJnw== X-Forwarded-Encrypted: i=1; AJvYcCWEFGzAv0qiQN9WF5Y/2RRukjx5MAyL0SXRla622IG+iVYbyHjIy2nVojTG3XSbircnN9RvvQ==@debbugs.gnu.org X-Gm-Message-State: AOJu0YxhKE/Lg4Pq2TgzNLX+KhEwRXWEptfXf5m0xr8o4RWwdXePNEI/ dU27fX/PW5Cfcq1TBuaKp0zTkBKy+kMvOKi4/K6KDsK5cz0dImCK X-Google-Smtp-Source: AGHT+IFLVNRc/0KRXh73NAufHDo5hREUPWF+rwAKKdDs3JVCC8+0xbHs0CW84IS1UHN/RMzVCkwdsQ== X-Received: by 2002:a05:6870:248c:b0:260:e3fa:ab8d with SMTP id 586e51a60fabf-277902e3092mr2123194fac.37.1724907278379; Wed, 28 Aug 2024 21:54:38 -0700 (PDT) Original-Received: from smtpclient.apple ([2601:646:8f81:6120:fd58:c8a8:ed8f:39fa]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e5576d7bsm313961b3a.30.2024.08.28.21.54.37 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 28 Aug 2024 21:54:37 -0700 (PDT) In-Reply-To: <86wmk0hlnr.fsf@gnu.org> X-Mailer: Apple Mail (2.3776.700.51) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:290902 Archived-At: --Apple-Mail=_9859E5A0-532E-402E-BB00-A4685E688A7B Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Aug 28, 2024, at 5:33=E2=80=AFAM, Eli Zaretskii = wrote: >=20 >> From: Yuan Fu >> Date: Tue, 27 Aug 2024 22:36:46 -0700 >> Cc: Stefan Kangas , >> Alan Mackenzie , >> 64830@debbugs.gnu.org >>=20 >> +struct treesit_loaded_lang >> +{ >> + /* The language object. */ >> + TSLanguage *lang; >> + /* The path of the shared library. */ >> + const char *path; >=20 > Gnu Coding Standard frowns on using "path" for anything except > PATH-style directory lists. Please use "filename" or "fname" or > something like that instead. >=20 >> + Dl_info info; >> + if (dladdr(langfn, &info)) >> + loaded_lang.path =3D info.dli_fname; >=20 > dladdr is non-portable. We have dynlib_addr instead, and since > treesit.c correctly uses dynlib.c functions already, using dynlib_addr > is only natural. >=20 >> + if (!lang.lang || !lang.path) return Qnil; >> + >> + return build_string (lang.path); > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > I think we should do >=20 > return > DECODE_FILE (make_unibyte_string (lang.filename, strlen = (lang.filename)); >=20 > instead, because dynlib_addr (and dladdr as well) return encoded file > names. Ah, thanks for the review! TIL. Here=E2=80=99s the revised patch. Yuan --Apple-Mail=_9859E5A0-532E-402E-BB00-A4685E688A7B Content-Disposition: attachment; filename=grammar-location.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="grammar-location.patch" Content-Transfer-Encoding: quoted-printable =46rom=2097374b55f2a786bf24db63bf206ccf217927de4f=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Yuan=20Fu=20=0ADate:=20Tue,=20= 27=20Aug=202024=2022:31:42=20-0700=0ASubject:=20[PATCH]=20Add=20= Ftreesit_grammar_location=0A=0A*=20src/treesit.c=20= (treesit_loaded_lang):=20New=20struct.=0A(treesit_load_language):=20= Return=20a=20struct=20instead=20of=20just=20the=20language=0Aobject.=20=20= The=20struct=20contains=20both=20the=20language=20object=20and=20the=20= path=20to=0Athe=20shared=20library.=0A(Ftreesit_language_available_p,=20= Ftreesit_language_abi_version)=0A(treesit_ensure_query_compiled,=20= Ftreesit_parser_create):=20Update=0Acall=20of=20treesit_load_language.=0A= (Ftreesit_grammar_location):=20New=20function.=0A---=0A=20src/treesit.c=20= |=2068=20+++++++++++++++++++++++++++++++++++++++++----------=0A=201=20= file=20changed,=2055=20insertions(+),=2013=20deletions(-)=0A=0Adiff=20= --git=20a/src/treesit.c=20b/src/treesit.c=0Aindex=20= 5aedca44489..09f4aeb0b99=20100644=0A---=20a/src/treesit.c=0A+++=20= b/src/treesit.c=0A@@=20-22,6=20+22,7=20@@=20Copyright=20(C)=202021-2024=20= Free=20Software=20Foundation,=20Inc.=0A=20#include=20=0A=20= #include=20"lisp.h"=0A=20#include=20"buffer.h"=0A+#include=20"coding.h"=0A= =20=0A=20#include=20"treesit.h"=0A=20=0A@@=20-491,6=20+492,14=20@@=20= treesit_initialize=20(void)=0A=20=0C=0A=20/***=20Loading=20language=20= library=20=20*/=0A=20=0A+struct=20treesit_loaded_lang=0A+{=0A+=20=20/*=20= The=20language=20object.=20=20*/=0A+=20=20TSLanguage=20*lang;=0A+=20=20= /*=20The=20path=20to=20the=20shared=20library.=20=20*/=0A+=20=20const=20= char=20*filename;=0A+};=0A+=0A=20/*=20Translate=20a=20symbol=20= treesit-=20to=20a=20C=20name=20treesit_.=20=20*/=0A=20static=20= void=0A=20treesit_symbol_to_c_name=20(char=20*symbol_name)=0A@@=20-575,7=20= +584,7=20@@=20treesit_load_language_push_for_each_suffix=20(Lisp_Object=20= lib_base_name,=0A=20=0A=20=20=20=20If=20error=20occurs,=20return=20NULL=20= and=20fill=20SIGNAL_SYMBOL=20and=20SIGNAL_DATA=0A=20=20=20=20with=20= values=20suitable=20for=20xsignal.=20=20*/=0A-static=20TSLanguage=20*=0A= +static=20struct=20treesit_loaded_lang=0A=20treesit_load_language=20= (Lisp_Object=20language_symbol,=0A=20=09=09=20=20=20=20=20=20=20= Lisp_Object=20*signal_symbol,=20Lisp_Object=20*signal_data)=0A=20{=0A@@=20= -626,6=20+635,7=20@@=20treesit_load_language=20(Lisp_Object=20= language_symbol,=0A=20=20=20dynlib_handle_ptr=20handle;=0A=20=20=20const=20= char=20*error;=0A=20=20=20Lisp_Object=20error_list=20=3D=20Qnil;=0A+=20=20= struct=20treesit_loaded_lang=20loaded_lang=20=3D=20{=20NULL,=20NULL=20};=0A= =20=0A=20=20=20tail=20=3D=20path_candidates;=0A=20=20=20error=20=3D=20= NULL;=0A@@=20-650,7=20+660,7=20@@=20treesit_load_language=20(Lisp_Object=20= language_symbol,=0A=20=20=20=20=20=20=20=20=20=20mismatch.=20=20*/=0A=20=20= =20=20=20=20=20*signal_symbol=20=3D=20Qtreesit_load_language_error;=0A=20= =20=20=20=20=20=20*signal_data=20=3D=20Fcons=20(Qnot_found,=20Fnreverse=20= (error_list));=0A-=20=20=20=20=20=20return=20NULL;=0A+=20=20=20=20=20=20= return=20loaded_lang;=0A=20=20=20=20=20}=0A=20=0A=20=20=20/*=20Load=20= TSLanguage.=20=20*/=0A@@=20-672,7=20+682,7=20@@=20treesit_load_language=20= (Lisp_Object=20language_symbol,=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20= *signal_symbol=20=3D=20Qtreesit_load_language_error;=0A=20=20=20=20=20=20= =20*signal_data=20=3D=20list2=20(Qsymbol_error,=20build_string=20= (error));=0A-=20=20=20=20=20=20return=20NULL;=0A+=20=20=20=20=20=20= return=20loaded_lang;=0A=20=20=20=20=20}=0A=20=20=20TSLanguage=20*lang=20= =3D=20(*langfn)=20();=0A=20=0A@@=20-685,9=20+695,14=20@@=20= treesit_load_language=20(Lisp_Object=20language_symbol,=0A=20=20=20=20=20= =20=20*signal_symbol=20=3D=20Qtreesit_load_language_error;=0A=20=20=20=20= =20=20=20*signal_data=20=3D=20list2=20(Qversion_mismatch,=0A=20=09=09=09=20= =20=20=20make_fixnum=20(ts_language_version=20(lang)));=0A-=20=20=20=20=20= =20return=20NULL;=0A+=20=20=20=20=20=20return=20loaded_lang;=0A=20=20=20=20= =20}=0A-=20=20return=20lang;=0A+=0A+=20=20const=20char=20*sym;=0A+=20=20= dynlib_addr((void=20(*)=20(void))=20langfn,=20&loaded_lang.filename,=20= &sym);=0A+=0A+=20=20loaded_lang.lang=20=3D=20lang;=0A+=20=20return=20= loaded_lang;=0A=20}=0A=20=0A=20DEFUN=20("treesit-language-available-p",=20= Ftreesit_language_available_p,=0A@@=20-704,7=20+719,9=20@@=20DEFUN=20= ("treesit-language-available-p",=20Ftreesit_language_available_p,=0A=20=20= =20treesit_initialize=20();=0A=20=20=20Lisp_Object=20signal_symbol=20=3D=20= Qnil;=0A=20=20=20Lisp_Object=20signal_data=20=3D=20Qnil;=0A-=20=20if=20= (treesit_load_language=20(language,=20&signal_symbol,=20&signal_data)=20= =3D=3D=20NULL)=0A+=20=20struct=20treesit_loaded_lang=20loaded_lang=0A+=20= =20=20=20=3D=20treesit_load_language=20(language,=20&signal_symbol,=20= &signal_data);=0A+=20=20if=20(loaded_lang.lang=20=3D=3D=20NULL)=0A=20=20=20= =20=20{=0A=20=20=20=20=20=20=20if=20(NILP=20(detail))=0A=20=09return=20= Qnil;=0A@@=20-750,9=20+767,9=20@@=20DEFUN=20= ("treesit-language-abi-version",=20Ftreesit_language_abi_version,=0A=20=20= =20=20=20{=0A=20=20=20=20=20=20=20Lisp_Object=20signal_symbol=20=3D=20= Qnil;=0A=20=20=20=20=20=20=20Lisp_Object=20signal_data=20=3D=20Qnil;=0A-=20= =20=20=20=20=20TSLanguage=20*ts_language=20=3D=20treesit_load_language=20= (language,=0A-=09=09=09=09=09=09=20=20=20=20=20=20=20&signal_symbol,=0A-=09= =09=09=09=09=09=20=20=20=20=20=20=20&signal_data);=0A+=20=20=20=20=20=20= struct=20treesit_loaded_lang=20lang=0A+=09=3D=20treesit_load_language=20= (language,=20&signal_symbol,=20&signal_data);=0A+=20=20=20=20=20=20= TSLanguage=20*ts_language=20=3D=20lang.lang;=0A=20=20=20=20=20=20=20if=20= (ts_language=20=3D=3D=20NULL)=0A=20=09return=20Qnil;=0A=20=20=20=20=20=20= =20uint32_t=20version=20=3D=20=20ts_language_version=20(ts_language);=0A= @@=20-760,6=20+777,28=20@@=20DEFUN=20("treesit-language-abi-version",=20= Ftreesit_language_abi_version,=0A=20=20=20=20=20}=0A=20}=0A=20=0A+DEFUN=20= ("treesit-grammar-location",=20Ftreesit_grammar_location,=0A+=20=20=20=20= =20=20=20Streesit_grammar_location,=0A+=20=20=20=20=20=20=201,=201,=200,=0A= +=20=20=20=20=20=20=20doc:=20/*=20Return=20the=20path=20to=20the=20= grammar=20file=20for=20LANGUAGE.=0A+=0A+If=20LANGUAGE=20isn't=20loaded=20= yet,=20load=20it=20first.=20=20If=20the=20langauge=20can't=20be=0A= +loaded=20or=20the=20path=20couldn't=20be=20found,=20return=20nil.=20=20= */)=0A+=20=20(Lisp_Object=20language)=0A+{=0A+=20=20CHECK_SYMBOL=20= (language);=0A+=0A+=20=20Lisp_Object=20signal_symbol=20=3D=20Qnil;=0A+=20= =20Lisp_Object=20signal_data=20=3D=20Qnil;=0A+=20=20struct=20= treesit_loaded_lang=20lang=0A+=20=20=20=20=3D=20treesit_load_language=20= (language,=20&signal_symbol,=20&signal_data);=0A+=0A+=20=20if=20= (!lang.lang=20||=20!lang.filename)=20return=20Qnil;=0A+=0A+=20=20return=20= DECODE_FILE=20(make_unibyte_string=20(lang.filename,=0A+=09=09=09=09=09=20= =20=20strlen=20(lang.filename)));=0A+}=0A+=0A=20=0C=0A=20/***=20Parsing=20= functions=20=20*/=0A=20=0A@@=20-1305,8=20+1344,9=20@@=20= treesit_ensure_query_compiled=20(Lisp_Object=20query,=20Lisp_Object=20= *signal_symbol,=0A=20=20=20Lisp_Object=20language=20=3D=20= XTS_COMPILED_QUERY=20(query)->language;=0A=20=20=20/*=20This=20is=20the=20= main=20reason=20why=20we=20compile=20query=20lazily:=20to=20avoid=0A=20=20= =20=20=20=20loading=20languages=20early.=20=20*/=0A-=20=20TSLanguage=20= *treesit_lang=20=3D=20treesit_load_language=20(language,=20= signal_symbol,=0A-=09=09=09=09=09=09=20=20=20=20signal_data);=0A+=20=20= struct=20treesit_loaded_lang=20lang=0A+=20=20=20=20=3D=20= treesit_load_language=20(language,=20signal_symbol,=20signal_data);=0A+=20= =20TSLanguage=20*treesit_lang=20=3D=20lang.lang;=0A=20=20=20if=20= (treesit_lang=20=3D=3D=20NULL)=0A=20=20=20=20=20return=20NULL;=0A=20=0A= @@=20-1477,8=20+1517,9=20@@=20DEFUN=20("treesit-parser-create",=0A=20=20=20= Lisp_Object=20signal_symbol=20=3D=20Qnil;=0A=20=20=20Lisp_Object=20= signal_data=20=3D=20Qnil;=0A=20=20=20TSParser=20*parser=20=3D=20= ts_parser_new=20();=0A-=20=20TSLanguage=20*lang=20=3D=20= treesit_load_language=20(language,=20&signal_symbol,=0A-=09=09=09=09=09=20= =20=20=20&signal_data);=0A+=20=20struct=20treesit_loaded_lang=20= loaded_lang=0A+=20=20=20=20=3D=20treesit_load_language=20(language,=20= &signal_symbol,=20&signal_data);=0A+=20=20TSLanguage=20*lang=20=3D=20= loaded_lang.lang;=0A=20=20=20if=20(lang=20=3D=3D=20NULL)=0A=20=20=20=20=20= xsignal=20(signal_symbol,=20signal_data);=0A=20=20=20/*=20We=20check=20= language=20version=20when=20loading=20a=20language,=20so=20this=20should=0A= @@=20-4275,6=20+4316,7=20@@=20cons=20(REGEXP=20.=20FN),=20which=20is=20a=20= combination=20of=20a=20regexp=20and=20a=20predicate=0A=20=20=20defsubr=20= (&Streesit_language_available_p);=0A=20=20=20defsubr=20= (&Streesit_library_abi_version);=0A=20=20=20defsubr=20= (&Streesit_language_abi_version);=0A+=20=20defsubr=20= (&Streesit_grammar_location);=0A=20=0A=20=20=20defsubr=20= (&Streesit_parser_p);=0A=20=20=20defsubr=20(&Streesit_node_p);=0A--=20=0A= 2.39.5=20(Apple=20Git-151)=0A=0A= --Apple-Mail=_9859E5A0-532E-402E-BB00-A4685E688A7B--