From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: =?utf-8?Q?Mattias_Engdeg=C3=A5rd?= Newsgroups: gmane.emacs.devel Subject: Regexp bytecode disassembler Date: Fri, 20 Mar 2020 13:27:35 +0100 Message-ID: <4201DF24-BCC4-4C08-9857-38207B7C10B4@acm.org> Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_99242BAB-4870-4C06-A1C0-47A18D7E5376" Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="29385"; mail-complaints-to="usenet@ciao.gmane.io" To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Fri Mar 20 13:28:24 2020 Return-path: Envelope-to: ged-emacs-devel@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 1jFGlD-0007Y1-1q for ged-emacs-devel@m.gmane-mx.org; Fri, 20 Mar 2020 13:28:23 +0100 Original-Received: from localhost ([::1]:52234 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jFGlC-0000tm-1d for ged-emacs-devel@m.gmane-mx.org; Fri, 20 Mar 2020 08:28:22 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:58455) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jFGkY-0000Lv-RD for emacs-devel@gnu.org; Fri, 20 Mar 2020 08:27:44 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jFGkX-0003Z1-FG for emacs-devel@gnu.org; Fri, 20 Mar 2020 08:27:42 -0400 Original-Received: from mail79c50.megamailservers.eu ([91.136.10.89]:38588 helo=mail70c50.megamailservers.eu) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jFGkW-0003Rx-SQ for emacs-devel@gnu.org; Fri, 20 Mar 2020 08:27:41 -0400 X-Authenticated-User: mattiase@bredband.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu; s=maildub; t=1584707258; bh=zPnnfgQ7xzMwWZbskOBqzyq82qJMEWHHuqKhy+jmZx0=; h=From:Subject:Date:To:From; b=VKAXUU5je5Be+oQkpuvFZd80SJx4O7OWHZKRjnbajhGMg+Yz91AkjYgVeYkmBmbMO FNpCE1q1o1PsobFQnrutQ9fg7DyG0ZzlFayEKt6r6dmZarlOjfTKfCkD6Sc1XbK/Lx W4Dxbi0jj33TkkooOS7WOQMht7b2SjpPk0s/5x+g= Feedback-ID: mattiase@acm.or Original-Received: from stanniol.lan (c-6f4fe655.032-75-73746f71.bbcust.telenor.se [85.230.79.111]) (authenticated bits=0) by mail70c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id 02KCRZX9008749 for ; Fri, 20 Mar 2020 12:27:37 +0000 X-Mailer: Apple Mail (2.3445.104.11) X-CTCH-RefID: str=0001.0A782F20.5E74B694.0036, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0 X-CTCH-VOD: Unknown X-CTCH-Spam: Unknown X-CTCH-Score: 0.000 X-CTCH-Flags: 0 X-CTCH-ScoreCust: 0.000 X-CSC: 0 X-CHA: v=2.3 cv=OKBZIhSB c=1 sm=1 tr=0 a=fHaj9vQUQVKQ4sUldAaXuQ==:117 a=fHaj9vQUQVKQ4sUldAaXuQ==:17 a=M51BFTxLslgA:10 a=lcPahf9hRaofhmW9K4sA:9 a=CjuIK1q_8ugA:10 a=NHBBAlDaNL87p7r5d8EA:9 a=B2y7HmGcmWMA:10 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] X-Received-From: 91.136.10.89 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:245600 Archived-At: --Apple-Mail=_99242BAB-4870-4C06-A1C0-47A18D7E5376 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii It is sometimes useful to inspect the generated regexp engine bytecode, = but doing so currently involves recompiling with REGEX_EMACS_DEBUG = configured, setting an internal variable using a debugger, and watching = data scrolling past on stderr. This patch adds a lisp-based regexp bytecode disassembler which is = always available without any runtime cost to the regexp engine. It is = mainly a tool for maintainers but curious users may find it useful as = well. It has already revealed one bug in the regexp compiler, now fixed = (f189e5dc10). Any objections against it being added (to master)? --Apple-Mail=_99242BAB-4870-4C06-A1C0-47A18D7E5376 Content-Disposition: attachment; filename=0001-Add-regexp-bytecode-disassembler.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-Add-regexp-bytecode-disassembler.patch" Content-Transfer-Encoding: quoted-printable =46rom=20f7eba6c64acee0d9a445d6e139e86750e8d36bd5=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Tue,=2017=20Mar=202020=2015:09:10=20+0100=0A= Subject:=20[PATCH]=20Add=20regexp=20bytecode=20disassembler=0A=0AThis=20= is=20mainly=20intended=20for=20debugging=20and=20understanding=20the=20= regexp=0Aengine,=20and=20for=20anyone=20curious=20about=20how=20their=20= regexps=20really=20are=0Ainterpreted=20and=20why=20they=20are=20slow.=0A=0A= *=20src/search.c=20(Fregexp_bytecode):=20New=20function.=0A= (syms_of_search):=20Define=20the=20symbol.=0A*=20= lisp/emacs-lisp/regexp-disasm.el=20(regexp-disasm--classes)=0A= (regexp-disasm--syntax-codes,=20regexp-disasm,=20regexp-disassemble):=20= New.=0A---=0A=20lisp/emacs-lisp/regexp-disasm.el=20|=20267=20= +++++++++++++++++++++++++++++++=0A=20src/search.c=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20|=20=2020=20+++=0A=202=20files=20= changed,=20287=20insertions(+)=0A=20create=20mode=20100644=20= lisp/emacs-lisp/regexp-disasm.el=0A=0Adiff=20--git=20= a/lisp/emacs-lisp/regexp-disasm.el=20b/lisp/emacs-lisp/regexp-disasm.el=0A= new=20file=20mode=20100644=0Aindex=200000000000..aee26db381=0A---=20= /dev/null=0A+++=20b/lisp/emacs-lisp/regexp-disasm.el=0A@@=20-0,0=20= +1,267=20@@=0A+;;;=20regexp-disasm=20--=20disassemble=20regexp=20= bytecode=20=20-*-=20lexical-binding:=20t=20-*-=0A+=0A+;;=20Copyright=20= (C)=202020=20Free=20Software=20Foundation,=20Inc.=0A+=0A+;;=20This=20= file=20is=20part=20of=20GNU=20Emacs.=0A+=0A+;;=20GNU=20Emacs=20is=20free=20= software:=20you=20can=20redistribute=20it=20and/or=20modify=0A+;;=20it=20= under=20the=20terms=20of=20the=20GNU=20General=20Public=20License=20as=20= published=20by=0A+;;=20the=20Free=20Software=20Foundation,=20either=20= version=203=20of=20the=20License,=20or=0A+;;=20(at=20your=20option)=20= any=20later=20version.=0A+=0A+;;=20GNU=20Emacs=20is=20distributed=20in=20= the=20hope=20that=20it=20will=20be=20useful,=0A+;;=20but=20WITHOUT=20ANY=20= WARRANTY;=20without=20even=20the=20implied=20warranty=20of=0A+;;=20= MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20PARTICULAR=20PURPOSE.=20=20= See=20the=0A+;;=20GNU=20General=20Public=20License=20for=20more=20= details.=0A+=0A+;;=20You=20should=20have=20received=20a=20copy=20of=20= the=20GNU=20General=20Public=20License=0A+;;=20along=20with=20GNU=20= Emacs.=20=20If=20not,=20see=20.=0A+=0A= +;;;=20Commentary:=0A+=0A+;;=20Decode=20compiled=20Emacs=20regexp=20= bytecode=20and=20pretty-print.=0A+=0A+(defconst=20regexp-disasm--classes=0A= +=20=20[word=20lower=20punct=20space=20upper=20multibyte=20alpha=20alnum=20= graph=20print=20blank]=0A+=20=20"Vector=20of=20character=20classes,=20= corresponding=20to=20BIT_*=20in=20regex-emacs.c.")=0A+=0A+(defconst=20= regexp-disasm--syntax-codes=0A+=20=20[whitespace=20punctuation=20word=20= symbol=0A+=20=20=20open-parenthesis=20close-parenthesis=20= expression-prefix=20string-quote=0A+=20=20=20paired-delimiter=20escape=20= character-quote=20comment-start=20comment-end=0A+=20=20=20inherit=20= comment-delimiter=20string-delimiter]=0A+=20=20"Vector=20of=20syntax=20= codes,=20corresponding=20to=20enum=20syntaxcode=20in=20syntax.h=0A+but=20= using=20names=20from=20`rx'.")=0A+=0A+;;;###autoload=0A+(defun=20= regexp-disasm=20(regexp)=0A+=20=20"Disassemble=20REGEXP;=20return=20list=20= of=20instructions.=0A+Instructions=20are=20on=20the=20form=20(ADDRESS=20= .=20INSTR)=20where=20ADDRESS=20is=20the=0A+byte=20offset=20and=20INSTR=20= an=20S-expression=20representing=20the=20instruction."=0A+=20=20(let*=20= ((bc=20(regexp-bytecode=20regexp))=0A+=20=20=20=20=20=20=20=20=20= (read-u16=20(lambda=20(ofs)=20(+=20(aref=20bc=20ofs)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(ash=20(aref=20bc=20(1+=20ofs))=208))))=0A+=20=20=20=20=20= =20=20=20=20(read-u24=20(lambda=20(ofs)=20(+=20(aref=20bc=20ofs)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(ash=20(aref=20bc=20(+=20ofs=201))=208)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(ash=20(aref=20bc=20(+=20ofs=202))=20= 16))))=0A+=20=20=20=20=20=20=20=20=20(read-s16=20(lambda=20(ofs)=20(let=20= ((x=20(funcall=20read-u16=20ofs)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(-=20= x=20(ash=20(logand=20x=20#x8000)=201)))))=0A+=20=20=20=20=20=20=20=20=20= (mb=20(multibyte-string-p=20regexp))=0A+=20=20=20=20=20=20=20=20=20(len=20= (length=20bc))=0A+=20=20=20=20=20=20=20=20=20(i=200)=0A+=20=20=20=20=20=20= =20=20=20(entries=20nil))=0A+=20=20=20=20(while=20(<=20i=20len)=0A+=20=20= =20=20=20=20(let*=20((opcode=20(aref=20bc=20i))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20(entry-and-size=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(pcase=20opcode=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(0=20(cons=20'no-op=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(1=20(cons=20'succeed=201))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(2=20(let*=20((nbytes=20(aref=20bc=20(1+=20i)))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (raw=20(substring=20bc=20(+=20i=202)=20(+=20i=202=20nbytes)))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (str=20(if=20mb=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (decode-coding-string=20raw=20'utf-8-emacs)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= raw)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(cons=20(list=20'exactn=20str)=20(+=202=20nbytes))))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(3=20(cons=20'nonl=201))=20=20=20=20=20= ;=20`anychar'=20is=20a=20misnomer=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20((or=204=205)=20=20=20=20=20=20=20=20=20=20=20=20=20=20;=20= `charset',=20`notcharset'=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(let*=20((negated=20(=3D=20opcode=205))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(bitmap-len-raw=20= (aref=20bc=20(1+=20i)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(bitmap-len=20(logand=20bitmap-len-raw=20= #x7f))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(have-range-table=20(/=3D=20(logand=20bitmap-len-raw=20#x80)=20= 0))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(npairs=20(if=20have-range-table=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(funcall=20read-u16=20(+=20i=202=20bitmap-len=202))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=200))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(bitmap-pairs=20nil)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(classes=20nil)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (pairs=20nil))=0A+=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20;;=20Convert=20the=20bitmap=20to=20ranges.=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((first=20nil))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(dotimes=20= (j=20(*=20bitmap-len=208))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(if=20(/=3D=20(logand=20(aref=20bc=20(+=20i=20= 2=20(ash=20j=20-3)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (ash=201=20(logand=20j=207)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=200)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (unless=20first=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(setq=20first=20j))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(when=20= first=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(push=20(cons=20first=20(1-=20j))=20bitmap-pairs)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(setq=20first=20nil))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(when=20first=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(push=20(cons=20first=20(1-=20(*=20= bitmap-len=208)))=20bitmap-pairs)))=0A+=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(when=20have-range-table=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Convert=20class=20= bits=20to=20list=20of=20classes.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(let=20((class-bits=20(funcall=20read-u16=20= (+=20i=202=20bitmap-len))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(dotimes=20(j=20(length=20= regexp-disasm--classes))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(when=20(/=3D=20(logand=20class-bits=20= (ash=201=20j))=200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(push=20(aref=20regexp-disasm--classes=20= j)=20classes))))=0A+=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20;;=20Read=20range=20table.=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(dotimes=20(j=20npairs)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20= ((ofs=20(+=20i=202=20bitmap-len=204=20(*=20j=206)))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (from=20(funcall=20read-u24=20ofs))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(to=20=20=20= (funcall=20read-u24=20(+=20ofs=203))))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20(cons=20from=20to)=20= pairs))))=0A+=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(cons=20(list=20(if=20negated=20'notcharset=20'charset)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(reverse=20bitmap-pairs)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(reverse=20= classes)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(reverse=20pairs))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(+=202=20= bitmap-len=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(if=20have-range-table=204=200)=20(*=20npairs=20= 6)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(6=20(cons=20= (list=20'start-memory=20(aref=20bc=20(1+=20i)))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=202))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(7=20(cons=20(list=20'stop-memory=20= (aref=20bc=20(1+=20i)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=202))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(8=20(cons=20(list=20'duplicate=20(aref=20bc=20(1+=20i)))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=202))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(9=20= (cons=20'begline=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(10=20(cons=20'endline=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(11=20(cons=20'begbuf=201))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(12=20(cons=20'endbuf=201))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(13=20(cons=20(list=20'jump=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(+=20(funcall=20read-s16=20(1+=20i))=20i=203))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=203))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(14=20(cons=20(list=20= 'on-failure-jump=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(+=20(funcall=20read-s16=20= (1+=20i))=20i=203))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=203))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(15=20(cons=20(list=20'on-failure-keep-string-jump=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(+=20(funcall=20read-s16=20(1+=20i))=20i=203))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 3))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(16=20(cons=20= (list=20'on-failure-jump-loop=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(+=20(funcall=20= read-s16=20(1+=20i))=20i=203))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=203))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(17=20(cons=20(list=20= 'on-failure-jump-nastyloop=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(+=20(funcall=20= read-s16=20(1+=20i))=20i=203))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=203))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(18=20(cons=20(list=20'on-failure-jump-smart=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(+=20(funcall=20read-s16=20(1+=20i))=20i=20= 3))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=203))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (19=20(cons=20(list=20'succeed-n=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(+=20= (funcall=20read-s16=20(1+=20i))=20i=203)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (funcall=20read-u16=20(+=20i=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=205))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(20=20(cons=20(list=20'jump-n=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(+=20(funcall=20read-s16=20(1+=20i))=20i=203)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(funcall=20read-u16=20(+=20i=203)))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=205))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(21=20(cons=20(list=20= 'set-number-at=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(+=20(funcall=20read-s16=20(1+=20= i))=20i=203)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(funcall=20read-u16=20(+=20i=20= 3)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=205))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (22=20(cons=20'wordbeg=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(23=20(cons=20'wordend=201))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(24=20(cons=20'wordbound=201))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(25=20(cons=20'notwordbound=201))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(26=20(cons=20'symbeg=201))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(27=20(cons=20= 'symend=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(28=20= (cons=20(list=20'syntaxspec=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(aref=20= regexp-disasm--syntax-codes=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (aref=20bc=20(1+=20i))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=202))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(29=20(cons=20(list=20'notsyntaxspec=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(aref=20regexp-disasm--syntax-codes=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(aref=20bc=20(1+=20i))))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=202))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(30=20(cons=20'at-dot=201))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(31=20(cons=20(list=20= 'categoryspec=20(aref=20bc=20(1+=20i)))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=202))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(32=20(cons=20(list=20= 'notcategoryspec=20(aref=20bc=20(1+=20i)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=202))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(_=20(error=20"bad=20opcode=20at=20= ofs=20%d:=200x%02x"=20i=20opcode))))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20(entry=20(car=20entry-and-size))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20(size=20(cdr=20entry-and-size)))=0A+=20=20=20=20=20=20=20=20(push=20= (cons=20i=20entry)=20entries)=0A+=20=20=20=20=20=20=20=20(setq=20i=20(+=20= i=20size))))=0A+=20=20=20=20(reverse=20entries)))=0A+=0A+;;;###autoload=0A= +(defun=20regexp-disassemble=20(regexp)=0A+=20=20"Compile=20REGEXP=20and=20= print=20the=20disassembled=20bytecode."=0A+=20=20(interactive=20"XRegexp=20= (evaluated):=20")=0A+=20=20(let*=20((instructions=20(regexp-disasm=20= regexp))=0A+=20=20=20=20=20=20=20=20=20(control-chars=20'((?\b=20.=20?b)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(?\t=20.=20?t)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(?\n=20.=20?n)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(?\v=20.=20?v)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (?\f=20.=20?f)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(?\r=20.=20?r)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(?\e=20.=20?e)))=0A+=20=20=20=20= =20=20=20=20=20(quote-byte=20(lambda=20(c)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((esc=20(assq=20c=20= control-chars)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(cond=20(esc=20(string=20?\\=20(cdr=20esc)))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20((or=20(<=3D=20c=2031)=20(<=3D=20#x7f=20c=20#xff))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(format=20"\\%03o"=20c))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(t=20(string=20= c))))))=0A+=20=20=20=20=20=20=20=20=20(quote-string-char=20(lambda=20(c)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(let=20((esc=20(assq=20c=20control-chars)))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(cond=20(esc=20(string=20?\\=20(cdr=20esc)))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20((memq=20c=20'(?\\=20?\"))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(string=20?\\=20c))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20((or=20(<=3D=20c=2031)=20(=3D=20c=20127)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(>=3D=20c=20#x3fff80))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(format=20"\\%03o"=20(logand=20c=20#xff)))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(t=20(string=20c))))))=0A+=20=20= =20=20=20=20=20=20=20(quote-string=20(lambda=20(s)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(concat=20"\""=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(mapconcat=20quote-string-char=20s=20"")=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20"\"")))=0A+=20=20=20=20=20=20=20=20=20(quote-range=20= (lambda=20(range=20quote-char)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(if=20(eq=20(car=20range)=20(cdr=20= range))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(funcall=20quote-char=20(car=20range))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (format=20"%s-%s"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(funcall=20quote-char=20= (car=20range))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(funcall=20quote-char=20= (cdr=20range))))))=0A+=20=20=20=20=20=20=20=20=20(quote-range-uni=0A+=20=20= =20=20=20=20=20=20=20=20(lambda=20(range)=20(funcall=20quote-range=20= range=20quote-byte)))=0A+=20=20=20=20=20=20=20=20=20(quote-range-multi=0A= +=20=20=20=20=20=20=20=20=20=20(lambda=20(range)=20(funcall=20= quote-range=20range=20#'string))))=0A+=20=20=20=20= (with-output-to-temp-buffer=20"*Regexp-disassemble*"=0A+=20=20=20=20=20=20= (with-current-buffer=20standard-output=0A+=20=20=20=20=20=20=20=20= (insert=20(format=20"Disassembly=20of=20regexp=20%s\n\n"=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(funcall=20= quote-string=20regexp)))=0A+=20=20=20=20=20=20=20=20(dolist=20(instr=20= instructions)=0A+=20=20=20=20=20=20=20=20=20=20(let*=20((addr=20(car=20= instr))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(op=20(cdr=20= instr))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(line=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(pcase=20op=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20((pred=20symbolp)=20= (symbol-name=20op))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(`(exactn=20,s)=20(format=20"exactn=20%s"=20(funcall=20= quote-string=20s)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(`(,(or=20'charset=20'notcharset)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20,bitmap-pairs=20,classes=20= ,pairs)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ;;=20FIXME:=20Maybe=20use=20a=20less=20ambiguous=20charset=20syntax.=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Avoid=20= ranges=20when=20endpoints=20are=20adjacent.=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20What=20to=20do=20about=20= metachars=20like=20`]'=20and=20`-'?=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(concat=20(format=20"%s=20[%s]"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(car=20op)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (mapconcat=20quote-range-uni=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20bitmap-pairs=20""))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(and=20= classes=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(concat=20"=20[:"=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(mapconcat=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20#'symbol-name=20classes=20",")=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20":]"))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(and=20= pairs=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(concat=20"=20["=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(mapconcat=20quote-range-multi=20pairs=20= "")=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"]"))))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(`(,(or=20= 'start-memory=20'stop-memory=20'duplicate)=20,n)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(format=20"%s=20group=20%d"=20= (car=20op)=20n))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(`(,(or=20'jump=20'on-failure-jump=20'on-failure-keep-string-jump=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20'on-failure-jump-loop=20'on-failure-jump-nastyloop=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 'on-failure-jump-smart)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20,dest)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(format=20"%s=20to=20%d"=20(car=20op)=20dest))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(`(,(or=20= 'succeed-n=20'jump-n=20'set-number-at)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20,dest=20,val)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(format=20"%s=20addr=20%d,=20= value=20%d"=20(car=20op)=20dest=20val))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(`(,(or=20'syntaxspec=20'notsyntaxspec)=20= ,syn)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (format=20"%s=20%s"=20(car=20op)=20syn))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(`(,(or=20'categoryspec=20= 'notcategoryspec)=20,ch)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(format=20"%s=20'%c'"=20(car=20op)=20ch))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(_=20(error=20= "unrecognised=20opcode:=20%S"=20op)))))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20(insert=20(format=20"%5d=20=20%s\n"=20addr=20line))))))))=0A+=0A= +(provide=20'regexp-disasm)=0A+=0A+;;;=20regexp-disasm.el=20ends=20here=0A= diff=20--git=20a/src/search.c=20b/src/search.c=0Aindex=20= 818bb4af24..ee5c0432f0=20100644=0A---=20a/src/search.c=0A+++=20= b/src/search.c=0A@@=20-3106,6=20+3106,25=20@@=20= record_unwind_save_match_data=20(void)=0A=20=09=09=09=20Fmatch_data=20= (Qnil,=20Qnil,=20Qnil));=0A=20}=0A=20=0A+DEFUN=20("regexp-bytecode",=20= Fregexp_bytecode,=20Sregexp_bytecode,=201,=201,=200,=0A+=20=20=20=20=20=20= =20doc:=20/*=20Compile=20REGEXP=20and=20return=20the=20compiled=20= bytecode.=0A+The=20compiled=20bytecode=20is=20returned=20as=20a=20= string;=20its=20format=20is=0A+implementation-dependent.=20=20Cached=20= bytecode=20may=20be=20returned=20if=20available.=20=20*/)=0A+=20=20= (Lisp_Object=20regexp)=0A+{=0A+=20=20CHECK_STRING=20(regexp);=0A+=20=20= struct=20regexp_cache=20*cache_entry=20=3D=20compile_pattern=20(=0A+=20=20= =20=20regexp,=0A+=20=20=20=20NULL,=0A+=20=20=20=20(!NILP=20(BVAR=20= (current_buffer,=20case_fold_search))=0A+=20=20=20=20=20?=20BVAR=20= (current_buffer,=20case_canon_table)=20:=20Qnil),=0A+=20=20=20=20false,=0A= +=20=20=20=20true);=0A+=20=20struct=20re_pattern_buffer=20*pb=20=3D=20= &cache_entry->buf;=0A+=20=20return=20make_unibyte_string=20(pb->buffer,=20= pb->used);=0A+}=0A+=0A+=0A=20/*=20Quote=20a=20string=20to=20deactivate=20= reg-expr=20chars=20*/=0A=20=0A=20DEFUN=20("regexp-quote",=20= Fregexp_quote,=20Sregexp_quote,=201,=201,=200,=0A@@=20-3400,6=20+3419,7=20= @@=20syms_of_search=20(void)=0A=20=20=20defsubr=20(&Smatch_end);=0A=20=20= =20defsubr=20(&Smatch_data);=0A=20=20=20defsubr=20(&Sset_match_data);=0A= +=20=20defsubr=20(&Sregexp_bytecode);=0A=20=20=20defsubr=20= (&Sregexp_quote);=0A=20=20=20defsubr=20(&Snewline_cache_check);=0A=20=0A= --=20=0A2.21.1=20(Apple=20Git-122.3)=0A=0A= --Apple-Mail=_99242BAB-4870-4C06-A1C0-47A18D7E5376--