comparison lisp/psgml/psgml-parse.el @ 2:ac2d302a0011 r19-15b2

Import from CVS: tag r19-15b2
author cvs
date Mon, 13 Aug 2007 08:46:35 +0200
parents 376386a54a3c
children bcdc7deadc19
comparison
equal deleted inserted replaced
1:c0c6a60d29db 2:ac2d302a0011
1 ;;;; psgml-parse.el --- Parser for SGML-editing mode with parsing support 1 ;;;; psgml-parse.el --- Parser for SGML-editing mode with parsing support
2 ;; $Id: psgml-parse.el,v 1.1.1.1 1996/12/18 03:35:21 steve Exp $ 2 ;; $Id: psgml-parse.el,v 1.1.1.2 1996/12/18 03:47:15 steve Exp $
3 3
4 ;; Copyright (C) 1994, 1995 Lennart Staflin 4 ;; Copyright (C) 1994, 1995 Lennart Staflin
5 5
6 ;; Author: Lennart Staflin <lenst@lysator.liu.se> 6 ;; Author: Lennart Staflin <lenst@lysator.liu.se>
7 ;; Acknowledgment: 7 ;; Acknowledgment:
179 (defvar sgml-current-localcat nil 179 (defvar sgml-current-localcat nil
180 "Value of `sgml-local-catalogs' in main buffer. Valid during parsing.") 180 "Value of `sgml-local-catalogs' in main buffer. Valid during parsing.")
181 181
182 (defvar sgml-current-local-ecat nil 182 (defvar sgml-current-local-ecat nil
183 "Value of `sgml-local-ecat-files' in main buffer. Valid during parsing.") 183 "Value of `sgml-local-ecat-files' in main buffer. Valid during parsing.")
184
185 (defvar sgml-current-top-buffer nil
186 "The buffer of the document entity, the main buffer.
187 Valid during parsing. This is used to find current directory for
188 catalogs.")
184 189
185 (defvar sgml-current-state nil 190 (defvar sgml-current-state nil
186 "Current state in content model or model type if CDATA, RCDATA or ANY.") 191 "Current state in content model or model type if CDATA, RCDATA or ANY.")
187 192
188 (defvar sgml-current-shortmap nil 193 (defvar sgml-current-shortmap nil
310 ;; 1. moves for required tokens, 2. moves for optional tokens. 315 ;; 1. moves for required tokens, 2. moves for optional tokens.
311 ;; By design these are keept in two different sets. 316 ;; By design these are keept in two different sets.
312 ;; [Alt: they could perhaps have been keept in one set but 317 ;; [Alt: they could perhaps have been keept in one set but
313 ;; marked in different ways.] 318 ;; marked in different ways.]
314 319
315 ;; The &-model groups creates too big state machines, therefor 320 ;; The and-model groups creates too big state machines, therefor
316 ;; there is a datastruture called &-node. 321 ;; there is a datastruture called and-node.
317 322
318 ;; A &-node is a specification for a dfa that has not been computed. 323 ;; A and-node is a specification for a dfa that has not been computed.
319 ;; It contains a set of dfas that all have to be traversed befor going 324 ;; It contains a set of dfas that all have to be traversed befor going
320 ;; to the next state. The &-nodes are only stored in moves and are 325 ;; to the next state. The and-nodes are only stored in moves and are
321 ;; not seen by the parser. When a move is taken the &-node is converted 326 ;; not seen by the parser. When a move is taken the and-node is converted
322 ;; to a &-state. 327 ;; to a and-state.
323 328
324 ;; A &-state keeps track of which dfas still need to be 329 ;; A and-state keeps track of which dfas still need to be
325 ;; traversed and the state of the current dfa. 330 ;; traversed and the state of the current dfa.
326 331
327 ;; move = <token, node> 332 ;; move = <token, node>
328 333
329 ;; node = normal-state | &-node 334 ;; node = normal-state | and-node
330 335
331 ;; &-node = <dfas, next> 336 ;; and-node = <dfas, next>
332 ;; where: dfas is a set of normal-state 337 ;; where: dfas is a set of normal-state
333 ;; next is a normal-state 338 ;; next is a normal-state
334 339
335 ;; State = normal-state | &-state 340 ;; State = normal-state | and-state
336 ;; The parser only knows about the state type. 341 ;; The parser only knows about the state type.
337 342
338 ;; normal-state = <opts, reqs> 343 ;; normal-state = <opts, reqs>
339 ;; where: opts is a set of moves for optional tokens 344 ;; where: opts is a set of moves for optional tokens
340 ;; reqs is a set of moves for required tokens 345 ;; reqs is a set of moves for required tokens
341 346
342 ;; &-state = <substate, dfas, next> 347 ;; and-state = <substate, dfas, next>
343 ;; where: substate is a normal-state 348 ;; where: substate is a normal-state
344 ;; dfas is a set of states 349 ;; dfas is a set of states
345 ;; next is the next state 350 ;; next is the next state
346 351
347 ;; The &-state is only used during the parsing. 352 ;; The and-state is only used during the parsing.
348 ;; Primitiv functions to get data from parse state need 353 ;; Primitiv functions to get data from parse state need
349 ;; to know both normal-state and &-state. 354 ;; to know both normal-state and and-state.
350 355
351 356
352 ;;; Representations: 357 ;;; Representations:
353 358
354 ;;move: (token . node) 359 ;;move: (token . node)
407 (let ((s1 (sgml-make-state)) 412 (let ((s1 (sgml-make-state))
408 (s2 (sgml-make-state))) 413 (s2 (sgml-make-state)))
409 (sgml-add-req-move s1 token s2) 414 (sgml-add-req-move s1 token s2)
410 s1)) 415 s1))
411 416
412 ;;&-state: (state next . dfas) 417 ;;and-state: (state next . dfas)
413 418
414 (defsubst sgml-make-&state (state dfas next) 419 (defsubst sgml-make-and-state (state dfas next)
415 (cons state (cons next dfas))) 420 (cons state (cons next dfas)))
416 421
417 (defsubst sgml-step-&state (state &state) 422 (defsubst sgml-step-and-state (state and-state)
418 (cons state (cdr &state))) 423 (cons state (cdr and-state)))
419 424
420 (defsubst sgml-&state-substate (s) 425 (defsubst sgml-and-state-substate (s)
421 (car s)) 426 (car s))
422 427
423 (defsubst sgml-&state-dfas (s) 428 (defsubst sgml-and-state-dfas (s)
424 (cddr s)) 429 (cddr s))
425 430
426 (defsubst sgml-&state-next (s) 431 (defsubst sgml-and-state-next (s)
427 (cadr s)) 432 (cadr s))
428 433
429 434
430 ;;&-node: (next . dfas) 435 ;;and-node: (next . dfas)
431 436
432 (defsubst sgml-make-&node (dfas next) 437 (defsubst sgml-make-and-node (dfas next)
433 (cons next dfas)) 438 (cons next dfas))
434 439
435 (defmacro sgml-&node-next (n) 440 (defmacro sgml-and-node-next (n)
436 (` (car (, n)))) 441 (` (car (, n))))
437 442
438 (defmacro sgml-&node-dfas (n) 443 (defmacro sgml-and-node-dfas (n)
439 (` (cdr (, n)))) 444 (` (cdr (, n))))
440 445
441 446
442 ;;; Using states 447 ;;; Using states
443 448
451 (sgml-moves-lookup token (sgml-state-reqs state))))) 456 (sgml-moves-lookup token (sgml-state-reqs state)))))
452 (if c 457 (if c
453 (let ((dest (sgml-move-dest c))) 458 (let ((dest (sgml-move-dest c)))
454 (if (sgml-normal-state-p dest) 459 (if (sgml-normal-state-p dest)
455 dest 460 dest
456 ;; dest is a &-node 461 ;; dest is a and-node
457 (sgml-next-sub& (sgml-&node-dfas dest) 462 (sgml-next-sub-and (sgml-and-node-dfas dest)
463 token
464 (sgml-and-node-next dest)))))))
465 (t ;state is a and-state
466 (sgml-get-and-move state token))))
467
468 (defun sgml-get-and-move (state token)
469 ;; state is a and-state
470 (let ((m (sgml-get-move (sgml-and-state-substate state) token)))
471 (cond (m (cons m (cdr state)))
472 ((sgml-final (sgml-and-state-substate state))
473 (sgml-next-sub-and (sgml-and-state-dfas state)
458 token 474 token
459 (sgml-&node-next dest))))))) 475 (sgml-and-state-next state))))))
460 (t ;state is a &-state 476
461 (sgml-get-&move state token)))) 477 (defun sgml-next-sub-and (dfas token next)
462
463 (defun sgml-get-&move (state token)
464 ;; state is a &-state
465 (let ((m (sgml-get-move (sgml-&state-substate state) token)))
466 (cond (m (cons m (cdr state)))
467 ((sgml-state-final-p (sgml-&state-substate state))
468 (sgml-next-sub& (sgml-&state-dfas state)
469 token
470 (sgml-&state-next state))))))
471
472 (defun sgml-next-sub& (dfas token next)
473 "Compute the next state, choosing from DFAS and moving by TOKEN. 478 "Compute the next state, choosing from DFAS and moving by TOKEN.
474 If this is not possible, but all DFAS are final, move by TOKEN in NEXT." 479 If this is not possible, but all DFAS are final, move by TOKEN in NEXT."
475 (let ((allfinal t) 480 (let ((allfinal t)
476 (l dfas) 481 (l dfas)
477 (res nil) 482 (res nil)
478 s1 s2) 483 s1 s2)
479 (while (and l (not res)) 484 (while (and l (not res))
480 (setq s1 (car l) 485 (setq s1 (car l)
481 allfinal (and allfinal (sgml-state-final-p s1)) 486 allfinal (and allfinal (sgml-state-final-p s1))
482 s2 (sgml-get-move s1 token) 487 s2 (sgml-get-move s1 token)
483 res (and s2 (sgml-make-&state s2 (remq s1 dfas) next)) 488 res (and s2 (sgml-make-and-state s2 (remq s1 dfas) next))
484 l (cdr l))) 489 l (cdr l)))
485 (cond (res) 490 (cond (res)
486 (allfinal (sgml-get-move next token))))) 491 (allfinal (sgml-get-move next token)))))
487 492
488 (defsubst sgml-tokens-of-moves (moves) 493 (defsubst sgml-tokens-of-moves (moves)
490 moves)) 495 moves))
491 496
492 (defun sgml-required-tokens (state) 497 (defun sgml-required-tokens (state)
493 (if (sgml-normal-state-p state) 498 (if (sgml-normal-state-p state)
494 (sgml-tokens-of-moves (sgml-state-reqs state)) 499 (sgml-tokens-of-moves (sgml-state-reqs state))
495 (or (sgml-required-tokens (sgml-&state-substate state)) 500 (or (sgml-required-tokens (sgml-and-state-substate state))
496 (loop for s in (sgml-&state-dfas state) 501 (loop for s in (sgml-and-state-dfas state)
497 nconc (sgml-tokens-of-moves (sgml-state-reqs s))) 502 nconc (sgml-tokens-of-moves (sgml-state-reqs s)))
498 (sgml-tokens-of-moves (sgml-state-reqs (sgml-&state-next state)))))) 503 (sgml-tokens-of-moves (sgml-state-reqs (sgml-and-state-next state))))))
499 504
500 505
501 (defsubst sgml-final (state) 506 (defsubst sgml-final (state)
502 (if (sgml-normal-state-p state) 507 (if (sgml-normal-state-p state)
503 (sgml-state-final-p state) 508 (sgml-state-final-p state)
504 (sgml-final& state))) 509 (sgml-final-and state)))
505 510
506 (defun sgml-final& (state) 511 (defun sgml-final-and (state)
507 (and (sgml-final (sgml-&state-substate state)) 512 (and (sgml-final (sgml-and-state-substate state))
508 (loop for s in (sgml-&state-dfas state) 513 (loop for s in (sgml-and-state-dfas state)
509 always (sgml-state-final-p s)) 514 always (sgml-state-final-p s))
510 (sgml-state-final-p (sgml-&state-next state)))) 515 (sgml-state-final-p (sgml-and-state-next state))))
511 516
512 (defun sgml-optional-tokens (state) 517 (defun sgml-optional-tokens (state)
513 (if (sgml-normal-state-p state) 518 (if (sgml-normal-state-p state)
514 (sgml-tokens-of-moves (sgml-state-opts state)) 519 (sgml-tokens-of-moves (sgml-state-opts state))
515 (nconc 520 (nconc
516 (sgml-optional-tokens (sgml-&state-substate state)) 521 (sgml-optional-tokens (sgml-and-state-substate state))
517 (if (sgml-final (sgml-&state-substate state)) 522 (if (sgml-final (sgml-and-state-substate state))
518 (loop for s in (sgml-&state-dfas state) 523 (loop for s in (sgml-and-state-dfas state)
519 nconc (sgml-tokens-of-moves (sgml-state-opts s)))) 524 nconc (sgml-tokens-of-moves (sgml-state-opts s))))
520 (if (loop for s in (sgml-&state-dfas state) 525 (if (loop for s in (sgml-and-state-dfas state)
521 always (sgml-state-final-p s)) 526 always (sgml-state-final-p s))
522 (sgml-tokens-of-moves (sgml-state-opts (sgml-&state-next state))))))) 527 (sgml-tokens-of-moves
528 (sgml-state-opts (sgml-and-state-next state)))))))
523 529
524 530
525 ;;;; Attribute Types 531 ;;;; Attribute Types
526 532
527 ;;; Basic Types 533 ;;; Basic Types
973 (sgml-dtd-eltypes dtd)) 979 (sgml-dtd-eltypes dtd))
974 (nreverse *res*))) 980 (nreverse *res*)))
975 981
976 ;;;; Load a saved dtd 982 ;;;; Load a saved dtd
977 983
984 ;;; Wing addition
978 (defmacro sgml-char-int (ch) 985 (defmacro sgml-char-int (ch)
979 (if (fboundp 'char-int) 986 (if (fboundp 'char-int)
980 (` (char-int (, ch))) 987 (` (char-int (, ch)))
981 ch)) 988 ch))
982 989
983 (defsubst sgml-read-octet () 990 (defsubst sgml-read-octet ()
991 ;; Wing change
984 (prog1 (sgml-char-int (following-char)) 992 (prog1 (sgml-char-int (following-char))
985 (forward-char))) 993 (forward-char)))
986 994
987 (defsubst sgml-read-number () 995 (defsubst sgml-read-number ()
988 "Read a number. 996 "Read a number.
1026 (defun sgml-read-model () 1034 (defun sgml-read-model ()
1027 (let* ((n (sgml-read-number)) 1035 (let* ((n (sgml-read-number))
1028 (sgml-read-nodes (make-vector n nil))) 1036 (sgml-read-nodes (make-vector n nil)))
1029 (loop for i below n do (aset sgml-read-nodes i (sgml-make-state))) 1037 (loop for i below n do (aset sgml-read-nodes i (sgml-make-state)))
1030 (loop for e across sgml-read-nodes do 1038 (loop for e across sgml-read-nodes do
1031 (cond ((eq 255 (sgml-read-peek)) ; a &node 1039 (cond ((eq 255 (sgml-read-peek)) ; a and-node
1032 (sgml-read-octet) ; skip 1040 (sgml-read-octet) ; skip
1033 (setf (sgml-&node-next e) (sgml-read-node-ref)) 1041 (setf (sgml-and-node-next e) (sgml-read-node-ref))
1034 (setf (sgml-&node-dfas e) (sgml-read-model-seq))) 1042 (setf (sgml-and-node-dfas e) (sgml-read-model-seq)))
1035 (t ; a normal-state 1043 (t ; a normal-state
1036 (setf (sgml-state-opts e) (sgml-read-moves)) 1044 (setf (sgml-state-opts e) (sgml-read-moves))
1037 (setf (sgml-state-reqs e) (sgml-read-moves))))) 1045 (setf (sgml-state-reqs e) (sgml-read-moves)))))
1038 (aref sgml-read-nodes 0))) 1046 (aref sgml-read-nodes 0)))
1039 1047
1196 do (sgml-entity-declare name parameters 'text val)) 1204 do (sgml-entity-declare name parameters 'text val))
1197 (sgml-push-to-entity dtd-file) 1205 (sgml-push-to-entity dtd-file)
1198 (sgml-check-dtd-subset) 1206 (sgml-check-dtd-subset)
1199 (sgml-pop-entity) 1207 (sgml-pop-entity)
1200 (erase-buffer) 1208 (erase-buffer)
1209 ;; For XEmacs-20.0/Mule
1210 (setq file-coding-system 'noconv)
1201 (sgml-write-dtd sgml-dtd-info to-file) 1211 (sgml-write-dtd sgml-dtd-info to-file)
1202 t)) 1212 t))
1203 1213
1204 (defun sgml-check-entities (params1 params2) 1214 (defun sgml-check-entities (params1 params2)
1205 "Check that PARAMS1 is compatible with PARAMS2." 1215 "Check that PARAMS1 is compatible with PARAMS2."
1223 1233
1224 (defun sgml-bdtd-merge () 1234 (defun sgml-bdtd-merge ()
1225 "Merge the binary coded dtd in the current buffer with the current dtd. 1235 "Merge the binary coded dtd in the current buffer with the current dtd.
1226 The current dtd is the variable sgml-dtd-info. Return t if mereged 1236 The current dtd is the variable sgml-dtd-info. Return t if mereged
1227 was successfull or nil if failed." 1237 was successfull or nil if failed."
1238 (setq file-coding-system 'noconv)
1228 (goto-char (point-min)) 1239 (goto-char (point-min))
1229 (sgml-read-sexp) ; skip filev 1240 (sgml-read-sexp) ; skip filev
1230 (let ((dependencies (sgml-read-sexp)) 1241 (let ((dependencies (sgml-read-sexp))
1231 (parameters (sgml-read-sexp)) 1242 (parameters (sgml-read-sexp))
1232 (gc-cons-threshold (max gc-cons-threshold 500000)) 1243 (gc-cons-threshold (max gc-cons-threshold 500000))
1775 (not (eq (sgml-entity-type entity) 'text))) 1786 (not (eq (sgml-entity-type entity) 'text)))
1776 1787
1777 (defun sgml-entity-marked-undefined-p (entity) 1788 (defun sgml-entity-marked-undefined-p (entity)
1778 (cdddr entity)) 1789 (cdddr entity))
1779 1790
1780 (defun sgml-entity-insert-text (entity &optional ptype)
1781 "Insert the text of ENTITY.
1782 PTYPE can be 'param if this is a parameter entity."
1783 (let ((text (sgml-entity-text entity)))
1784 (cond
1785 ((stringp text)
1786 (insert text))
1787 (t
1788 (unless (sgml-insert-external-entity text
1789 (or ptype
1790 (sgml-entity-type entity))
1791 (sgml-entity-name entity))
1792 ;; Mark entity as not found
1793 (setcdr (cddr entity) t) ;***
1794 )))))
1795
1796 (defun sgml-entity-file (entity &optional ptype)
1797 (sgml-external-file (sgml-entity-text entity)
1798 (or ptype (sgml-entity-type entity))
1799 (sgml-entity-name entity)))
1800 1791
1801 ;;; Entity tables 1792 ;;; Entity tables
1802 ;; Represented by a cons-cell whose car is the default entity (or nil) 1793 ;; Represented by a cons-cell whose car is the default entity (or nil)
1803 ;; and whose cdr is as an association list. 1794 ;; and whose cdr is as an association list.
1804 1795
1837 (defun sgml-merge-entity-tables (tab1 tab2) 1828 (defun sgml-merge-entity-tables (tab1 tab2)
1838 "Merge entity table TAB2 into TAB1. TAB1 is modified." 1829 "Merge entity table TAB2 into TAB1. TAB1 is modified."
1839 (nconc tab1 (cdr tab2)) 1830 (nconc tab1 (cdr tab2))
1840 (setcar tab1 (or (car tab1) (car tab2)))) 1831 (setcar tab1 (or (car tab1) (car tab2))))
1841 1832
1833
1834 (defun sgml-entity-insert-text (entity &optional ptype)
1835 "Insert the text of ENTITY.
1836 PTYPE can be 'param if this is a parameter entity."
1837 (let ((text (sgml-entity-text entity)))
1838 (cond
1839 ((stringp text)
1840 (insert text))
1841 (t
1842 (sgml-insert-external-entity text
1843 (or ptype
1844 (sgml-entity-type entity))
1845 (sgml-entity-name entity))))))
1842 1846
1843 ;;;; External identifyer resolve 1847 ;;;; External identifyer resolve
1844 1848
1845 (defun sgml-cache-catalog (file cache-var parser-fun) 1849 (defun sgml-cache-catalog (file cache-var parser-fun
1850 &optional default-dir)
1846 "Return parsed catalog. 1851 "Return parsed catalog.
1847 FILE is the file containing the catalog. Maintains a cache of parsed 1852 FILE is the file containing the catalog. Maintains a cache of parsed
1848 catalog files in variable CACHE-VAR. The parsing is done by function 1853 catalog files in variable CACHE-VAR. The parsing is done by function
1849 PARSER-FUN that should parse the current buffer and return the parsed 1854 PARSER-FUN that should parse the current buffer and return the parsed
1850 repreaentation of the catalog." 1855 repreaentation of the catalog."
1851 (setq file (expand-file-name file)) 1856 (setq file (file-truename (expand-file-name file default-dir)))
1852 (and 1857 (and
1853 (file-readable-p file) 1858 (file-readable-p file)
1854 (let ((c (assoc file (symbol-value cache-var))) 1859 (let ((c (assoc file (symbol-value cache-var)))
1855 (modtime (elt (file-attributes file) 5))) 1860 (modtime (elt (file-attributes file) 5)))
1856 (if (and c (equal (second c) modtime)) 1861 (if (and c (equal (second c) modtime))
1864 (sgml-pop-entity) 1869 (sgml-pop-entity)
1865 (push (cons file (cons modtime new)) (symbol-value cache-var)) 1870 (push (cons file (cons modtime new)) (symbol-value cache-var))
1866 (message "Loading %s ... done" file) 1871 (message "Loading %s ... done" file)
1867 new))))) 1872 new)))))
1868 1873
1874 (defun sgml-main-directory ()
1875 "Directory of the document entity."
1876 (let ((cb (current-buffer)))
1877 (set-buffer sgml-current-top-buffer)
1878 (prog1 default-directory
1879 (set-buffer cb))))
1880
1881 (defun sgml-trace-lookup (&rest args)
1882 "Log a message like `sgml-log-message', but only if `sgml-trace-entity-lookup' is set."
1883 (when sgml-trace-entity-lookup
1884 (apply (function sgml-log-message) args)))
1885
1886
1869 (defun sgml-catalog-lookup (files pubid type name) 1887 (defun sgml-catalog-lookup (files pubid type name)
1870 "Look up the public identifier/entity name in catalogs. 1888 "Look up the public identifier/entity name in catalogs.
1871 FILES is a list of catalogs to use. PUBID is the public identifier 1889 FILES is a list of catalogs to use. PUBID is the public identifier
1872 \(if any). TYPE is the entity type and NAME is the entity name." 1890 \(if any). TYPE is the entity type and NAME is the entity name."
1873 (cond ((eq type 'param) 1891 (cond ((eq type 'param)
1874 (setq name (format "%%%s" name) 1892 (setq name (format "%%%s" name)
1875 type 'entity)) 1893 type 'entity))
1876 ((eq type 'dtd) 1894 ((eq type 'dtd)
1877 (setq type 'doctype))) 1895 (setq type 'doctype)))
1878 1896 ;;(sgml-trace-lookup " [pubid='%s' type=%s name='%s']" pubid type name)
1879 (loop 1897 (loop
1880 for f in files thereis 1898 for f in files thereis
1881 (let ((cat (sgml-cache-catalog f 'sgml-catalog-assoc 1899 (let ((cat (sgml-cache-catalog f 'sgml-catalog-assoc
1882 (function sgml-parse-catalog-buffer)))) 1900 (function sgml-parse-catalog-buffer)
1901 (sgml-main-directory))))
1902 (sgml-trace-lookup " catalog: %s %s"
1903 (expand-file-name f (sgml-main-directory))
1904 (if (null cat) "empty/non existent" "exists"))
1883 (or 1905 (or
1884 ;; Giv PUBLIC entries priority over ENTITY and DOCTYPE 1906 ;; Giv PUBLIC entries priority over ENTITY and DOCTYPE
1885 (if pubid 1907 (if pubid
1886 (loop for (key cname file) in cat 1908 (loop for (key cname file) in cat
1887 thereis (and (eq 'public key) 1909 thereis (if (and (eq 'public key)
1888 (string= pubid cname) 1910 (string= pubid cname))
1889 (file-readable-p file) 1911 (if (file-readable-p file)
1890 file))) 1912 (progn
1913 (sgml-trace-lookup " >> %s [by pubid]" file)
1914 file)
1915 (progn
1916 (sgml-trace-lookup " !unreadable %s" file)
1917 nil)))))
1891 (loop for (key cname file) in cat 1918 (loop for (key cname file) in cat
1892 thereis (and (eq type key) 1919 ;;do (sgml-trace-lookup " %s %s" key cname)
1893 (or (null cname) 1920 thereis (if (and (eq type key)
1894 (string= name cname)) 1921 (or (null cname)
1895 (file-readable-p file) 1922 (string= name cname)))
1896 file)))))) 1923 (if (file-readable-p file)
1897 1924 (progn
1898 (defun sgml-search-catalog (func filter) 1925 (sgml-trace-lookup " >> %s [by %s %s]"
1899 (loop 1926 file key cname)
1900 for files in (list sgml-local-catalogs sgml-catalog-files) 1927 file)
1901 thereis 1928 (progn
1902 (loop for file in files thereis 1929 (sgml-trace-lookup " !unreadable %s" file)
1903 (loop for entry in (sgml-cache-catalog 1930 nil))))))))
1904 file 'sgml-catalog-assoc
1905 (function sgml-parse-catalog-buffer))
1906 when (or (null filter)
1907 (memq (car entry) filter))
1908 thereis (funcall func entry)))))
1909 1931
1910 (defun sgml-path-lookup (extid type name) 1932 (defun sgml-path-lookup (extid type name)
1911 (let* ((pubid (sgml-extid-pubid extid)) 1933 (let* ((pubid (sgml-extid-pubid extid))
1912 (sysid (sgml-extid-sysid extid)) 1934 (sysid (sgml-extid-sysid extid))
1913 (subst (list '(?% ?%)))) 1935 (subst (list '(?% ?%))))
1937 Optional argument TYPE should be the type of entity and NAME should be 1959 Optional argument TYPE should be the type of entity and NAME should be
1938 the entity name." 1960 the entity name."
1939 ;; extid is (pubid . sysid) 1961 ;; extid is (pubid . sysid)
1940 (let ((pubid (sgml-extid-pubid extid))) 1962 (let ((pubid (sgml-extid-pubid extid)))
1941 (when pubid (setq pubid (sgml-canonize-pubid pubid))) 1963 (when pubid (setq pubid (sgml-canonize-pubid pubid)))
1964 (sgml-trace-lookup "Start looking for %s entity %s public %s system %s"
1965 (or type "-")
1966 (or name "?")
1967 pubid
1968 (sgml-extid-sysid extid))
1942 (or (if sgml-system-identifiers-are-preferred 1969 (or (if sgml-system-identifiers-are-preferred
1943 (sgml-lookup-sysid-as-file extid)) 1970 (sgml-lookup-sysid-as-file extid))
1944 (sgml-catalog-lookup sgml-current-localcat pubid type name) 1971 (sgml-catalog-lookup sgml-current-localcat pubid type name)
1945 (sgml-catalog-lookup sgml-catalog-files pubid type name) 1972 (sgml-catalog-lookup sgml-catalog-files pubid type name)
1946 (if (not sgml-system-identifiers-are-preferred) 1973 (if (not sgml-system-identifiers-are-preferred)
1977 2004
1978 2005
1979 ;; Parse a buffer full of catalogue entries. 2006 ;; Parse a buffer full of catalogue entries.
1980 (defun sgml-parse-catalog-buffer () 2007 (defun sgml-parse-catalog-buffer ()
1981 "Parse all entries in a catalogue." 2008 "Parse all entries in a catalogue."
2009 (sgml-trace-lookup " (Parsing catalog)")
1982 (loop 2010 (loop
1983 while (sgml-skip-cs) 2011 while (sgml-skip-cs)
1984 for type = (downcase (sgml-check-cat-literal)) 2012 for type = (downcase (sgml-check-cat-literal))
1985 for class = (cdr (assoc type '(("public" . public) ("dtddecl" . public) 2013 for class = (cdr (assoc type '(("public" . public) ("dtddecl" . public)
1986 ("entity" . name) ("linktype" . name) 2014 ("entity" . name) ("linktype" . name)
2120 (defun sgml-epos-eref (epos) 2148 (defun sgml-epos-eref (epos)
2121 (if (consp epos) 2149 (if (consp epos)
2122 (car epos))) 2150 (car epos)))
2123 2151
2124 (defun sgml-epos-pos (epos) 2152 (defun sgml-epos-pos (epos)
2153 "The buffer position of EPOS withing its entity."
2125 (if (consp epos) 2154 (if (consp epos)
2126 (cdr epos) 2155 (cdr epos)
2127 epos)) 2156 epos))
2128 2157
2129 (defun sgml-bpos-p (epos) 2158 (defun sgml-bpos-p (epos)
2159 "True if EPOS is a position in the main buffer."
2130 (numberp epos)) 2160 (numberp epos))
2131 2161
2132 (defun sgml-strict-epos-p (epos) 2162 (defun sgml-strict-epos-p (epos)
2163 "True if EPOS is a position in an entity other then the main buffer."
2133 (consp epos)) 2164 (consp epos))
2134 2165
2135 (defun sgml-epos (pos) 2166 (defun sgml-epos (pos)
2136 "Convert a buffer position POS into an epos." 2167 "Convert a buffer position POS into an epos."
2137 (if sgml-current-eref 2168 (if sgml-current-eref
2138 (sgml-make-epos sgml-current-eref pos) 2169 (sgml-make-epos sgml-current-eref pos)
2139 pos)) 2170 pos))
2140 2171
2141 (defun sgml-epos-erliest (epos) 2172 (defun sgml-epos-before (epos)
2173 "The last position in buffer not after EPOS.
2174 If EPOS is a buffer position this is the same. If EPOS is in an entity
2175 this is the buffer position before the entity reference."
2142 (while (consp epos) 2176 (while (consp epos)
2143 (setq epos (sgml-eref-start (sgml-epos-eref epos)))) 2177 (setq epos (sgml-eref-start (sgml-epos-eref epos))))
2144 epos) 2178 epos)
2145 2179
2146 (defun sgml-epos-latest (epos) 2180 (defun sgml-epos-after (epos)
2181 "The first position in buffer after EPOS.
2182 If EPOS is in an other entity, buffer position is after
2183 entity reference leading to EPOS."
2147 (while (consp epos) 2184 (while (consp epos)
2148 (setq epos (sgml-eref-end (sgml-epos-eref epos)))) 2185 (setq epos (sgml-eref-end (sgml-epos-eref epos))))
2149 epos) 2186 epos)
2150 2187
2151 (defun sgml-epos-promote (epos) 2188 (defun sgml-epos-promote (epos)
2189 "Convert position in entity structure EPOS to a buffer position.
2190 If EPOS is in an entity, the buffer position will be the position
2191 before the entity reference if EPOS is first character in entity
2192 text. Otherwise buffer position will be after entity reference."
2152 (while (and (consp epos) 2193 (while (and (consp epos)
2153 (= (cdr epos) 1)) 2194 (= (cdr epos) 1))
2154 (setq epos (sgml-eref-start (car epos)))) 2195 (setq epos (sgml-eref-start (car epos))))
2155 (sgml-epos-latest epos)) 2196 (sgml-epos-after epos))
2156 2197
2157 2198
2158 ;;;; DTD repository 2199 ;;;; DTD repository
2159 ;;compiled-dtd: extid -> Compiled-DTD? 2200 ;;compiled-dtd: extid -> Compiled-DTD?
2160 ;;extid-cdtd-name: extid -> file? 2201 ;;extid-cdtd-name: extid -> file?
2238 (defun sgml-try-merge-compiled-dtd (pubid file) 2279 (defun sgml-try-merge-compiled-dtd (pubid file)
2239 (when pubid (setq pubid (sgml-canonize-pubid pubid))) 2280 (when pubid (setq pubid (sgml-canonize-pubid pubid)))
2240 (when file (setq file (expand-file-name file))) 2281 (when file (setq file (expand-file-name file)))
2241 (sgml-debug "Find compiled dtd for %s %s" pubid file) 2282 (sgml-debug "Find compiled dtd for %s %s" pubid file)
2242 (let ((ce (or (sgml-ecat-lookup sgml-current-local-ecat pubid file) 2283 (let ((ce (or (sgml-ecat-lookup sgml-current-local-ecat pubid file)
2243 (sgml-ecat-lookup sgml-ecat-files pubid file))) 2284 (sgml-ecat-lookup sgml-ecat-files pubid file))))
2244 cfile dtd ents)
2245 (and ce 2285 (and ce
2246 (let ((cfile (car ce)) 2286 (let ((cfile (car ce))
2247 (ents (cdr ce))) 2287 (ents (cdr ce)))
2248 (sgml-debug "Found %s" cfile) 2288 (sgml-debug "Found %s" cfile)
2249 (if (sgml-use-special-case) 2289 (if (sgml-use-special-case)
2299 (defun sgml-push-to-entity (entity &optional ref-start type) 2339 (defun sgml-push-to-entity (entity &optional ref-start type)
2300 "Set current buffer to a buffer containing the entity ENTITY. 2340 "Set current buffer to a buffer containing the entity ENTITY.
2301 ENTITY can also be a file name. Optional argument REF-START should be 2341 ENTITY can also be a file name. Optional argument REF-START should be
2302 the start point of the entity reference. Optional argument TYPE, 2342 the start point of the entity reference. Optional argument TYPE,
2303 overrides the entity type in entity look up." 2343 overrides the entity type in entity look up."
2344 (sgml-debug "Push to %s"
2345 (cond ((stringp entity)
2346 (format "string '%s'" entity))
2347 (t
2348 (sgml-entity-name entity))))
2304 (when ref-start 2349 (when ref-start
2350 ;; don't consider a RS shortref here again
2305 (setq sgml-rs-ignore-pos ref-start)) 2351 (setq sgml-rs-ignore-pos ref-start))
2306 (unless (and sgml-scratch-buffer 2352 (unless (and sgml-scratch-buffer
2307 (buffer-name sgml-scratch-buffer)) 2353 (buffer-name sgml-scratch-buffer))
2308 (setq sgml-scratch-buffer (generate-new-buffer " *entity*"))) 2354 (setq sgml-scratch-buffer (generate-new-buffer " *entity*")))
2309 (let ((cb (current-buffer)) 2355 (let ((cb (current-buffer))
2313 (sgml-make-entity entity nil nil) 2359 (sgml-make-entity entity nil nil)
2314 entity) 2360 entity)
2315 (sgml-epos (or ref-start (point))) 2361 (sgml-epos (or ref-start (point)))
2316 (sgml-epos (point))))) 2362 (sgml-epos (point)))))
2317 (set-buffer sgml-scratch-buffer) 2363 (set-buffer sgml-scratch-buffer)
2364 ;; For MULE to not misinterpret binary data set the mc-flag
2365 ;; (reported by Jeffrey Friedl <jfriedl@nff.ncl.omron.co.jp>)
2366 (setq mc-flag nil)
2367 ;; For XEmacs 20.0/Mule
2368 (setq file-coding-system 'noconv)
2318 (when (eq sgml-scratch-buffer (default-value 'sgml-scratch-buffer)) 2369 (when (eq sgml-scratch-buffer (default-value 'sgml-scratch-buffer))
2319 (make-local-variable 'sgml-scratch-buffer) 2370 (make-local-variable 'sgml-scratch-buffer)
2320 (setq sgml-scratch-buffer nil)) 2371 (setq sgml-scratch-buffer nil))
2372 (when after-change-function ;***
2373 (message "OOPS: after-change-function not NIL in scratch buffer %s: %s"
2374 (current-buffer)
2375 after-change-function)
2376 (setq before-change-function nil
2377 after-change-function nil))
2321 (setq sgml-last-entity-buffer (current-buffer)) 2378 (setq sgml-last-entity-buffer (current-buffer))
2322 (erase-buffer) 2379 (erase-buffer)
2323 (setq default-directory dd) 2380 (setq default-directory dd)
2324 (make-local-variable 'sgml-current-eref) 2381 (make-local-variable 'sgml-current-eref)
2325 (setq sgml-current-eref eref) 2382 (setq sgml-current-eref eref)
2330 ; as #RS if internal entity. 2387 ; as #RS if internal entity.
2331 (if (or (stringp entity) 2388 (if (or (stringp entity)
2332 (stringp (sgml-entity-text entity))) 2389 (stringp (sgml-entity-text entity)))
2333 (point) 2390 (point)
2334 0)) 2391 0))
2392 (when sgml-buffer-parse-state
2393 (sgml-debug "-- pstate set in scratch buffer")
2394 (setq sgml-buffer-parse-state nil))
2335 (cond 2395 (cond
2336 ((stringp entity) ; a file name 2396 ((stringp entity) ; a file name
2337 (save-excursion (insert-file-contents entity)) 2397 (save-excursion (insert-file-contents entity))
2338 (setq default-directory (file-name-directory entity))) 2398 (setq default-directory (file-name-directory entity)))
2339 ((and sgml-parsing-dtd 2399 ((consp (sgml-entity-text entity)) ; external id?
2340 (consp (sgml-entity-text entity))) ; external id? 2400 (let* ((extid (sgml-entity-text entity))
2341 (let ((file (sgml-entity-file entity type))) 2401 (file
2342 (sgml-debug "Push to %s = %s" (sgml-entity-text entity) file) 2402 (sgml-external-file extid
2403 (or type (sgml-entity-type entity))
2404 (sgml-entity-name entity))))
2405 (when sgml-parsing-dtd
2406 (push (or file t)
2407 (sgml-dtd-dependencies sgml-dtd-info)))
2408 (sgml-debug "Push to %s = %s" extid file)
2343 (cond 2409 (cond
2344 ((and file 2410 ((and file sgml-parsing-dtd
2345 (sgml-try-merge-compiled-dtd (car (sgml-entity-text entity)) 2411 (sgml-try-merge-compiled-dtd (sgml-extid-pubid extid)
2346 file)) 2412 file))
2347 (goto-char (point-max))) 2413 (goto-char (point-max)))
2348 (file 2414 (file
2349 ;; fifth arg not available in early v19 2415 ;; fifth arg not available in early v19
2350 (erase-buffer) 2416 (erase-buffer)
2351 (insert-file-contents file nil nil nil) 2417 (insert-file-contents file nil nil nil)
2352 (setq default-directory (file-name-directory file)) 2418 (setq default-directory (file-name-directory file))
2353 (goto-char (point-min)) 2419 (goto-char (point-min)))
2354 (push file (sgml-dtd-dependencies sgml-dtd-info))) 2420 (t ;; No file for entity
2355 (t 2421 (save-excursion
2356 (push t (sgml-dtd-dependencies sgml-dtd-info)) 2422 (let* ((pubid (sgml-extid-pubid extid))
2357 (save-excursion (sgml-entity-insert-text entity type)))))) 2423 (sysid (sgml-extid-sysid extid)))
2358 (t 2424 (or (if sysid ; try the sysid hooks
2359 (save-excursion (sgml-entity-insert-text entity type)))))) 2425 (loop for fn in sgml-sysid-resolve-functions
2426 thereis (funcall fn sysid)))
2427 (progn
2428 ;; Mark entity as not found
2429 (setcdr (cddr entity) t) ;***
2430 (sgml-log-warning "External entity %s not found"
2431 (sgml-entity-name entity))
2432 (when pubid
2433 (sgml-log-warning " Public identifier %s" pubid))
2434 (when sysid
2435 (sgml-log-warning " System identfier %s" sysid))
2436 nil))))))))
2437 (t ;; internal entity
2438 (save-excursion
2439 (insert (sgml-entity-text entity)))))))
2360 2440
2361 (defun sgml-pop-entity () 2441 (defun sgml-pop-entity ()
2362 (cond ((and (boundp 'sgml-previous-buffer) 2442 (cond ((and (boundp 'sgml-previous-buffer)
2363 (bufferp sgml-previous-buffer)) 2443 (bufferp sgml-previous-buffer))
2364 (sgml-debug "Exit entity") 2444 (sgml-debug "Exit entity")
2409 (:constructor sgml-make-tree 2489 (:constructor sgml-make-tree
2410 (eltype stag-epos stag-len parent level 2490 (eltype stag-epos stag-len parent level
2411 excludes includes pstate net-enabled 2491 excludes includes pstate net-enabled
2412 conref &optional shortmap pshortmap asl))) 2492 conref &optional shortmap pshortmap asl)))
2413 eltype ; element object 2493 eltype ; element object
2414 ;;start ; start point in buffer 2494 ;;start ; start point in buffer
2415 ;;end ; end point in buffer 2495 ;;end ; end point in buffer
2416 stag-epos ; start-tag entity position 2496 stag-epos ; start-tag entity position
2417 etag-epos ; end-tag entity position 2497 etag-epos ; end-tag entity position
2418 stag-len ; length of start-tag 2498 stag-len ; length of start-tag
2419 etag-len ; length of end-tag 2499 etag-len ; length of end-tag
2431 pshortmap ; parents shortmap 2511 pshortmap ; parents shortmap
2432 asl ; attribute specification list 2512 asl ; attribute specification list
2433 ) 2513 )
2434 2514
2435 2515
2436 ;;element-end (e):
2437 ;; If bpos-p (etag-epos (e)):
2438 ;; return etag-epos (e) + etag-len (e)
2439 ;; If etag-len (e) = 0: return promote (etag-epos (e))
2440 ;; else: return latest (etag-epos (e))
2441 (defun sgml-tree-end (tree) 2516 (defun sgml-tree-end (tree)
2442 "Buffer position after end of TREE" 2517 "Buffer position after end of TREE."
2443 (let ((epos (sgml-tree-etag-epos tree)) 2518 (let ((epos (sgml-tree-etag-epos tree))
2444 (len (sgml-tree-etag-len tree))) 2519 (len (sgml-tree-etag-len tree)))
2445 (cond ((sgml-bpos-p epos) 2520 (cond ((sgml-bpos-p epos)
2446 (+ epos len)) 2521 (+ epos len))
2447 ((zerop len) 2522 ((zerop len)
2448 (sgml-epos-promote epos)) 2523 (sgml-epos-promote epos))
2449 (t 2524 (t
2450 (sgml-epos-latest epos))))) 2525 (sgml-epos-after epos)))))
2451 2526
2452 2527
2453 ;;;; (text) Element view of parse tree 2528 ;;;; (text) Element view of parse tree
2454 2529
2455 (defmacro sgml-alias-fields (orig dest &rest fields) 2530 (defmacro sgml-alias-fields (orig dest &rest fields)
2530 (cond ((sgml-bpos-p epos) 2605 (cond ((sgml-bpos-p epos)
2531 (+ epos len)) 2606 (+ epos len))
2532 ((zerop len) 2607 ((zerop len)
2533 (sgml-epos-promote epos)) 2608 (sgml-epos-promote epos))
2534 (t 2609 (t
2535 (sgml-epos-latest epos))))) 2610 (sgml-epos-after epos)))))
2536 2611
2537 (defun sgml-element-empty (element) 2612 (defun sgml-element-empty (element)
2538 "True if ELEMENT is empty." 2613 "True if ELEMENT is empty."
2539 (or (eq sgml-empty (sgml-element-model element)) 2614 (or (eq sgml-empty (sgml-element-model element))
2540 (sgml-tree-conref element))) 2615 (sgml-tree-conref element)))
2565 (if (memq this-command '(backward-char previous-line backward-word)) 2640 (if (memq this-command '(backward-char previous-line backward-word))
2566 (goto-char (or (previous-single-property-change (point) 'invisible) 2641 (goto-char (or (previous-single-property-change (point) 'invisible)
2567 (point-min))) 2642 (point-min)))
2568 (goto-char (or (next-single-property-change (point) 'invisible) 2643 (goto-char (or (next-single-property-change (point) 'invisible)
2569 (point-max))))) 2644 (point-max)))))
2570 (when (and (not (input-pending-p)) 2645 (when (and (not executing-macro)
2571 (or sgml-live-element-indicator 2646 (or sgml-live-element-indicator
2572 sgml-set-face)) 2647 sgml-set-face)
2573 (let ((deactivate-mark nil) 2648 (not (null sgml-buffer-parse-state))
2574 (sgml-suppress-warning t) 2649 (sit-for 0))
2575 (oldname sgml-current-element-name)) 2650 (let ((deactivate-mark nil))
2576 (condition-case nil 2651 (sgml-need-dtd)
2577 (save-excursion 2652 (let ((start
2653 (save-excursion (sgml-find-start-point (point))
2654 (sgml-pop-all-entities)
2655 (point)))
2656 (eol-pos
2657 (save-excursion (end-of-line 1) (point))))
2658 (let ((quiet (< (- (point) start) 500)))
2659 ;;(message "Should parse %s to %s => %s" start (point) quiet)
2660 (when (if quiet
2661 t
2662 (setq sgml-current-element-name "?")
2663 (sit-for 1))
2664
2665 ;; Find current element
2578 (cond ((and (memq this-command sgml-users-of-last-element) 2666 (cond ((and (memq this-command sgml-users-of-last-element)
2579 sgml-last-element) 2667 sgml-last-element)
2580 (setq sgml-current-element-name 2668 (setq sgml-current-element-name
2581 (sgml-element-gi sgml-last-element))) 2669 (sgml-element-gi sgml-last-element)))
2582
2583 (sgml-live-element-indicator 2670 (sgml-live-element-indicator
2584 (setq sgml-current-element-name "*error*")
2585 (save-excursion 2671 (save-excursion
2586 (sgml-parse-to (point) (function input-pending-p))) 2672 (condition-case nil
2587 (unless (input-pending-p) 2673 (sgml-parse-to
2588 (setq sgml-current-element-name 2674 (point) (function input-pending-p) quiet)
2589 (sgml-element-gi sgml-current-tree))))) 2675 (error
2590 (unless (input-pending-p) 2676 (setq sgml-current-element-name "*error*")))
2591 (force-mode-line-update) 2677 (unless (input-pending-p)
2592 (when (and sgml-set-face 2678 (setq sgml-current-element-name
2593 (null 2679 (sgml-element-gi sgml-current-tree))))))
2594 (sgml-tree-etag-epos 2680 ;; Set face on current line
2595 (sgml-pstate-top-tree sgml-buffer-parse-state)))) 2681 (when (and sgml-set-face (not (input-pending-p)))
2596 (sit-for 0) 2682 (save-excursion
2597 (sgml-parse-until-end-of nil nil 2683 (condition-case nil
2598 (function input-pending-p) 2684 (sgml-parse-to
2599 t)))) 2685 eol-pos (function input-pending-p) quiet)
2600 (error nil)))))) 2686 (error nil)))))))
2601 2687 ;; Set face in rest of buffer
2688 (sgml-fontify-buffer 6) ;*** make option for delay
2689 ))))
2690
2691 (defun sgml-fontify-buffer (delay)
2692 (and
2693 sgml-set-face
2694 (null (sgml-tree-etag-epos
2695 (sgml-pstate-top-tree sgml-buffer-parse-state)))
2696 (sit-for delay)
2697 (condition-case nil
2698 (save-excursion
2699 (message "Fontifying...")
2700 (sgml-parse-until-end-of nil nil
2701 (function input-pending-p)
2702 t)
2703 (message "Fontifying...done"))
2704 (error nil))))
2602 2705
2603 (defun sgml-set-active-dtd-indicator (name) 2706 (defun sgml-set-active-dtd-indicator (name)
2604 (set (make-local-variable 'sgml-active-dtd-indicator) 2707 (set (make-local-variable 'sgml-active-dtd-indicator)
2605 (list (format " [%s" name) 2708 (list (format " [%s" name)
2606 '(sgml-live-element-indicator ("/" sgml-current-element-name)) 2709 '(sgml-live-element-indicator ("/" sgml-current-element-name))
2612 (defstruct (sgml-pstate 2715 (defstruct (sgml-pstate
2613 (:constructor sgml-make-pstate (dtd top-tree))) 2716 (:constructor sgml-make-pstate (dtd top-tree)))
2614 dtd 2717 dtd
2615 top-tree) 2718 top-tree)
2616 2719
2617 (defsubst sgml-excludes () 2720 ;(defsubst sgml-excludes ()
2618 (sgml-tree-excludes sgml-current-tree)) 2721 ; (sgml-tree-excludes sgml-current-tree))
2619 2722
2620 (defsubst sgml-includes () 2723 ;(defsubst sgml-includes ()
2621 (sgml-tree-includes sgml-current-tree)) 2724 ; (sgml-tree-includes sgml-current-tree))
2622 2725
2623 (defsubst sgml-current-mixed-p () 2726 (defsubst sgml-current-mixed-p ()
2624 (sgml-element-mixed sgml-current-tree)) 2727 (sgml-element-mixed sgml-current-tree))
2625 2728
2626 (defun sgml-set-initial-state (dtd) 2729 (defun sgml-set-initial-state (dtd)
2627 "Set initial state of parsing" 2730 "Set initial state of parsing"
2628 (make-local-variable 'before-change-function) 2731 (make-local-variable 'before-change-function)
2629 (setq before-change-function 'sgml-note-change-at) 2732 (setq before-change-function 'sgml-note-change-at)
2630 (set (make-local-variable 'after-change-function) 2733 (make-local-variable 'after-change-function)
2631 'sgml-set-face-after-change) 2734 (setq after-change-function 'sgml-set-face-after-change)
2632 (sgml-set-active-dtd-indicator (sgml-dtd-doctype dtd)) 2735 (sgml-set-active-dtd-indicator (sgml-dtd-doctype dtd))
2633 (let ((top-type ; Fake element type for the top 2736 (let ((top-type ; Fake element type for the top
2634 ; node of the parse tree 2737 ; node of the parse tree
2635 (sgml-make-eltype "#DOC") ; was "Document (no element)" 2738 (sgml-make-eltype "#DOC") ; was "Document (no element)"
2636 )) 2739 ))
2645 2748
2646 (defun sgml-set-parse-state (tree where) 2749 (defun sgml-set-parse-state (tree where)
2647 "Set parse state from TREE, either from start of TREE if WHERE is start 2750 "Set parse state from TREE, either from start of TREE if WHERE is start
2648 or from after TREE if WHERE is after." 2751 or from after TREE if WHERE is after."
2649 (setq sgml-current-tree tree 2752 (setq sgml-current-tree tree
2650 sgml-markup-tree tree) 2753 sgml-markup-tree tree
2754 sgml-rs-ignore-pos 0 )
2651 (let ((empty 2755 (let ((empty
2652 (sgml-element-empty tree))) 2756 (sgml-element-empty tree)))
2653 (cond ((and (eq where 'start) 2757 (cond ((and (eq where 'start)
2654 (not empty)) 2758 (not empty))
2655 (setq sgml-current-state (sgml-element-model sgml-current-tree) 2759 (setq sgml-current-state (sgml-element-model sgml-current-tree)
2731 eltype 2835 eltype
2732 (sgml-promoted-epos before-tag after-tag) ; stag-epos 2836 (sgml-promoted-epos before-tag after-tag) ; stag-epos
2733 (- after-tag before-tag) ; stag-len 2837 (- after-tag before-tag) ; stag-len
2734 sgml-current-tree ; parent 2838 sgml-current-tree ; parent
2735 (1+ (sgml-tree-level sgml-current-tree)) ; level 2839 (1+ (sgml-tree-level sgml-current-tree)) ; level
2736 (append (sgml-eltype-excludes eltype) (sgml-excludes)) 2840 (append (sgml-eltype-excludes eltype)
2737 (append (sgml-eltype-includes eltype) (sgml-includes)) 2841 (sgml-tree-excludes sgml-current-tree))
2842 (append (sgml-eltype-includes eltype)
2843 (sgml-tree-includes sgml-current-tree))
2738 sgml-current-state 2844 sgml-current-state
2739 (if (sgml-tree-net-enabled sgml-current-tree) 1) 2845 (if (sgml-tree-net-enabled sgml-current-tree) 1)
2740 conref 2846 conref
2741 newmap 2847 newmap
2742 sgml-current-shortmap 2848 sgml-current-shortmap
2750 ;; (setf (sgml-tree-next u) nt)) 2856 ;; (setf (sgml-tree-next u) nt))
2751 ;; (t 2857 ;; (t
2752 ;; (setf (sgml-tree-content sgml-current-tree) nt)))) 2858 ;; (setf (sgml-tree-content sgml-current-tree) nt))))
2753 ;; Install new node in tree 2859 ;; Install new node in tree
2754 (cond (sgml-previous-tree 2860 (cond (sgml-previous-tree
2861 (sgml-debug "Open element %s: after %s"
2862 eltype (sgml-tree-eltype sgml-previous-tree))
2755 (setf (sgml-tree-next sgml-previous-tree) nt)) 2863 (setf (sgml-tree-next sgml-previous-tree) nt))
2756 (t 2864 (t
2865 (sgml-debug "Open element %s: first in %s"
2866 eltype (sgml-tree-eltype sgml-current-tree))
2757 (setf (sgml-tree-content sgml-current-tree) nt))) 2867 (setf (sgml-tree-content sgml-current-tree) nt)))
2758 ;; Prune tree 2868 ;; Prune tree
2759 ;; *** all the way up? tree-end = nil? 2869 ;; *** all the way up? tree-end = nil?
2760 (setf (sgml-tree-next sgml-current-tree) nil) 2870 (setf (sgml-tree-next sgml-current-tree) nil)
2761 ;; Set new state 2871 ;; Set new state
2784 (when (or (eq sgml-close-element-trap t) 2894 (when (or (eq sgml-close-element-trap t)
2785 (eq sgml-close-element-trap sgml-current-tree)) 2895 (eq sgml-close-element-trap sgml-current-tree))
2786 (setq sgml-goal (point))) 2896 (setq sgml-goal (point)))
2787 (when sgml-throw-on-element-change 2897 (when sgml-throw-on-element-change
2788 (throw sgml-throw-on-element-change 'end)) 2898 (throw sgml-throw-on-element-change 'end))
2899 (sgml-debug "Close element %s" (sgml-tree-eltype sgml-current-tree))
2789 (setf (sgml-tree-etag-epos sgml-current-tree) 2900 (setf (sgml-tree-etag-epos sgml-current-tree)
2790 ;;(sgml-promoted-epos before-tag after-tag) 2901 ;;(sgml-promoted-epos before-tag after-tag)
2791 (sgml-epos before-tag)) 2902 (sgml-epos before-tag))
2792 (setf (sgml-tree-etag-len sgml-current-tree) (- after-tag before-tag)) 2903 (setf (sgml-tree-etag-len sgml-current-tree) (- after-tag before-tag))
2793 (run-hooks 'sgml-close-element-hook) 2904 (run-hooks 'sgml-close-element-hook)
2806 (sgml-tree-parent tree)) 2917 (sgml-tree-parent tree))
2807 2918
2808 (defun sgml-note-change-at (at &optional end) 2919 (defun sgml-note-change-at (at &optional end)
2809 ;; Inform the cache that there have been some changes after AT 2920 ;; Inform the cache that there have been some changes after AT
2810 (when sgml-buffer-parse-state 2921 (when sgml-buffer-parse-state
2922 (sgml-debug "sgml-note-change-at %s" at)
2811 (let ((u (sgml-pstate-top-tree sgml-buffer-parse-state))) 2923 (let ((u (sgml-pstate-top-tree sgml-buffer-parse-state)))
2812 (when u 2924 (when u
2813 ;;(message "%d" at) 2925 ;;(message "%d" at)
2814 (while 2926 (while
2815 (cond 2927 (cond
2858 (while ; Until token accepted 2970 (while ; Until token accepted
2859 (cond 2971 (cond
2860 ;; Test if accepted in state 2972 ;; Test if accepted in state
2861 ((or (eq state sgml-any) 2973 ((or (eq state sgml-any)
2862 (and (sgml-model-group-p state) 2974 (and (sgml-model-group-p state)
2863 (not (memq token (sgml-excludes))) 2975 (not (memq token (sgml-tree-excludes tree)))
2864 (or (memq token (sgml-includes)) 2976 (or (memq token (sgml-tree-includes tree))
2865 (sgml-get-move state token)))) 2977 (sgml-get-move state token))))
2866 nil) 2978 nil)
2867 ;; Test if end tag implied 2979 ;; Test if end tag implied
2868 ((or (eq state sgml-empty) 2980 ((or (eq state sgml-empty)
2869 (and (sgml-final-p state) 2981 (and (sgml-final-p state)
2870 (not (eq tree sgml-top-tree)))) 2982 (not (eq tree sgml-top-tree))))
2871 (unless (eq state sgml-empty) ; not realy implied 2983 (unless (eq state sgml-empty) ; not realy implied
2872 (push t imps)) 2984 (push t imps))
2873 (setq state (sgml-tree-pstate tree) 2985 (setq state (sgml-tree-pstate tree)
3178 (nconc table (list (cons name map)))) 3290 (nconc table (list (cons name map))))
3179 3291
3180 (defun sgml-lookup-shortref-map (table name) 3292 (defun sgml-lookup-shortref-map (table name)
3181 (cdr (assoc name (cdr table)))) 3293 (cdr (assoc name (cdr table))))
3182 3294
3295 (defun sgml-lookup-shortref-name (table map)
3296 (car (rassq map (cdr table))))
3297
3183 (defun sgml-merge-shortmaps (tab1 tab2) 3298 (defun sgml-merge-shortmaps (tab1 tab2)
3184 "Merge tables of short reference maps TAB2 into TAB1, modifying TAB1." 3299 "Merge tables of short reference maps TAB2 into TAB1, modifying TAB1."
3185 (nconc tab1 (cdr tab2))) 3300 (nconc tab1 (cdr tab2)))
3186 3301
3187 ;;;; Parse markup declarations 3302 ;;;; Parse markup declarations
3222 (sgml-setup-doctype (sgml-check-name) 3337 (sgml-setup-doctype (sgml-check-name)
3223 (sgml-parse-external)) 3338 (sgml-parse-external))
3224 (message "Parsing doctype...done")))) 3339 (message "Parsing doctype...done"))))
3225 (setq sgml-markup-type 'doctype)) 3340 (setq sgml-markup-type 'doctype))
3226 3341
3342 (defun sgml-check-end-of-entity (type)
3343 (unless (eobp)
3344 (sgml-parse-error "Illegal character '%c' in %s"
3345 (following-char)
3346 type)))
3347
3227 (defun sgml-setup-doctype (docname external) 3348 (defun sgml-setup-doctype (docname external)
3228 (let ((sgml-parsing-dtd t)) 3349 (let ((sgml-parsing-dtd t))
3229 (setq sgml-no-elements 0) 3350 (setq sgml-no-elements 0)
3230 (setq sgml-dtd-info (sgml-make-dtd docname)) 3351 (setq sgml-dtd-info (sgml-make-dtd docname))
3231 ;;(setq sgml-dtd-shortmaps nil) 3352 ;;(setq sgml-dtd-shortmaps nil)
3232 (sgml-skip-ps) 3353 (sgml-skip-ps)
3233 (cond 3354 (cond
3234 ((sgml-parse-delim "DSO") 3355 ((sgml-parse-delim "DSO")
3235 (sgml-check-dtd-subset) 3356 (let ((original-buffer (current-buffer)))
3236 (sgml-check-delim "DSC"))) 3357 (sgml-check-dtd-subset)
3358 (if (eq (current-buffer) original-buffer)
3359 (sgml-check-delim "DSC")
3360 (sgml-parse-error "Illegal character '%c' in doctype declaration"
3361 (following-char))))))
3237 (cond (external 3362 (cond (external
3238 (sgml-push-to-entity (sgml-make-entity docname 'dtd external)) 3363 (sgml-push-to-entity (sgml-make-entity docname 'dtd external))
3239 (unless (eobp) 3364 (sgml-check-dtd-subset)
3240 (sgml-check-dtd-subset) 3365 (sgml-check-end-of-entity "DTD subset")
3241 (unless (eobp)
3242 (sgml-parse-error "DTD subset ended")))
3243 (sgml-pop-entity))) 3366 (sgml-pop-entity)))
3244 ;;; (loop for map in sgml-dtd-shortmaps do 3367 ;;; (loop for map in sgml-dtd-shortmaps do
3245 ;;; (sgml-add-shortref-map 3368 ;;; (sgml-add-shortref-map
3246 ;;; (sgml-dtd-shortmaps sgml-dtd-info) 3369 ;;; (sgml-dtd-shortmaps sgml-dtd-info)
3247 ;;; (car map) 3370 ;;; (car map)
3314 ;;(search-forward "[") 3437 ;;(search-forward "[")
3315 (sgml-skip-marked-section)) 3438 (sgml-skip-marked-section))
3316 (t (forward-char 1))))) 3439 (t (forward-char 1)))))
3317 3440
3318 (defun sgml-do-usemap () 3441 (defun sgml-do-usemap ()
3319 (let (mapname associated) 3442 (let (mapname)
3320 ;;(setq sgml-markup-type 'usemap) 3443 ;;(setq sgml-markup-type 'usemap)
3321 (unless (sgml-parse-rni "empty") 3444 (unless (sgml-parse-rni "empty")
3322 (setq mapname (sgml-check-name))) 3445 (setq mapname (sgml-check-name)))
3323 (sgml-skip-ps) 3446 (sgml-skip-ps)
3324 (cond 3447 (cond
3474 ;; trap is used the parser is usually called with the end of the 3597 ;; trap is used the parser is usually called with the end of the
3475 ;; buffer as the goal point. 3598 ;; buffer as the goal point.
3476 3599
3477 (defun sgml-need-dtd () 3600 (defun sgml-need-dtd ()
3478 "Make sure that an eventual DTD is parsed or loaded." 3601 "Make sure that an eventual DTD is parsed or loaded."
3602 (sgml-pop-all-entities)
3479 (sgml-cleanup-entities) 3603 (sgml-cleanup-entities)
3480 (when (null sgml-buffer-parse-state) ; first parse in this buffer 3604 (when (null sgml-buffer-parse-state) ; first parse in this buffer
3481 ;;(sgml-set-initial-state) ; fall back DTD 3605 ;;(sgml-set-initial-state) ; fall back DTD
3482 (add-hook 'pre-command-hook 'sgml-reset-log) 3606 (add-hook 'pre-command-hook 'sgml-reset-log)
3483 (make-local-variable 'sgml-auto-fill-inhibit-function) 3607 (make-local-variable 'sgml-auto-fill-inhibit-function)
3484 (setq sgml-auto-fill-inhibit-function (function sgml-in-prolog-p)) 3608 (setq sgml-auto-fill-inhibit-function (function sgml-in-prolog-p))
3485 (if sgml-default-dtd-file 3609 (if sgml-default-dtd-file
3486 (sgml-load-dtd sgml-default-dtd-file) 3610 (sgml-load-dtd sgml-default-dtd-file)
3487 (sgml-load-doctype))) 3611 (sgml-load-doctype)))
3612 (sgml-debug "Need dtd getting state from %s" (buffer-name))
3488 (setq sgml-dtd-info (sgml-pstate-dtd sgml-buffer-parse-state) 3613 (setq sgml-dtd-info (sgml-pstate-dtd sgml-buffer-parse-state)
3489 sgml-top-tree (sgml-pstate-top-tree sgml-buffer-parse-state)) 3614 sgml-top-tree (sgml-pstate-top-tree sgml-buffer-parse-state))
3490 (sgml-set-global)) 3615 (sgml-set-global))
3491 3616
3492 3617
3513 3638
3514 (defun sgml-modify-dtd (modifier) 3639 (defun sgml-modify-dtd (modifier)
3515 (setq sgml-dtd-info (sgml-pstate-dtd sgml-buffer-parse-state) 3640 (setq sgml-dtd-info (sgml-pstate-dtd sgml-buffer-parse-state)
3516 sgml-top-tree (sgml-pstate-top-tree sgml-buffer-parse-state)) 3641 sgml-top-tree (sgml-pstate-top-tree sgml-buffer-parse-state))
3517 (sgml-set-global) 3642 (sgml-set-global)
3518 3643 ;;*** what is sgml-current-tree now?
3519 (while (stringp (cadr modifier)) ; Loop thru the context elements 3644 (while (stringp (cadr modifier)) ; Loop thru the context elements
3520 (let ((et (sgml-lookup-eltype (car modifier)))) 3645 (let ((et (sgml-lookup-eltype (car modifier))))
3521 (sgml-open-element et nil (point-min) (point-min)) 3646 (sgml-open-element et nil (point-min) (point-min))
3522 (setq modifier (cdr modifier)))) 3647 (setq modifier (cdr modifier))))
3523 3648
3539 do (setq sgml-current-state 3664 do (setq sgml-current-state
3540 (sgml-get-move sgml-current-state 3665 (sgml-get-move sgml-current-state
3541 (sgml-lookup-eltype seenel)))))) 3666 (sgml-lookup-eltype seenel))))))
3542 3667
3543 (let ((top (sgml-pstate-top-tree sgml-buffer-parse-state))) 3668 (let ((top (sgml-pstate-top-tree sgml-buffer-parse-state)))
3544 (setf (sgml-tree-includes top) (sgml-includes)) 3669 (setf (sgml-tree-includes top) (sgml-tree-includes sgml-current-tree))
3545 (setf (sgml-tree-excludes top) (sgml-excludes)) 3670 (setf (sgml-tree-excludes top) (sgml-tree-excludes sgml-current-tree))
3546 (setf (sgml-tree-shortmap top) sgml-current-shortmap) 3671 (setf (sgml-tree-shortmap top) sgml-current-shortmap)
3547 (setf (sgml-eltype-model (sgml-tree-eltype top)) 3672 (setf (sgml-eltype-model (sgml-tree-eltype top))
3548 sgml-current-state))) 3673 sgml-current-state)))
3549 3674
3550 3675
3551 (defun sgml-set-global () 3676 (defun sgml-set-global ()
3552 (setq sgml-current-omittag sgml-omittag 3677 (setq sgml-current-omittag sgml-omittag
3553 sgml-current-shorttag sgml-shorttag 3678 sgml-current-shorttag sgml-shorttag
3554 sgml-current-localcat sgml-local-catalogs 3679 sgml-current-localcat sgml-local-catalogs
3555 sgml-current-local-ecat sgml-local-ecat-files)) 3680 sgml-current-local-ecat sgml-local-ecat-files
3681 sgml-current-top-buffer (current-buffer)))
3556 3682
3557 (defun sgml-parse-prolog () 3683 (defun sgml-parse-prolog ()
3558 "Parse the document prolog to learn the DTD." 3684 "Parse the document prolog to learn the DTD."
3559 (interactive) 3685 (interactive)
3560 (sgml-clear-log) 3686 (sgml-debug "Parse prolog in buffer %s" (buffer-name))
3687 (unless sgml-debug
3688 (sgml-clear-log))
3561 (message "Parsing prolog...") 3689 (message "Parsing prolog...")
3562 (sgml-cleanup-entities) 3690 (sgml-cleanup-entities)
3563 (sgml-set-global) 3691 (sgml-set-global)
3564 (setq sgml-dtd-info nil) 3692 (setq sgml-dtd-info nil)
3565 (goto-char (point-min)) 3693 (goto-char (point-min))
3576 (sgml-setup-doctype docname '(nil)))))) 3704 (sgml-setup-doctype docname '(nil))))))
3577 (unless sgml-dtd-info 3705 (unless sgml-dtd-info
3578 (error "No document type defined by prolog")) 3706 (error "No document type defined by prolog"))
3579 (sgml-message "Parsing prolog...done")) 3707 (sgml-message "Parsing prolog...done"))
3580 3708
3709
3581 (defun sgml-parse-until-end-of (sgml-close-element-trap &optional 3710 (defun sgml-parse-until-end-of (sgml-close-element-trap &optional
3582 cont extra-cond quiet) 3711 cont extra-cond quiet)
3583 "Parse until the SGML-CLOSE-ELEMENT-TRAP has ended, 3712 "Parse until the SGML-CLOSE-ELEMENT-TRAP has ended,
3584 or if it is t, any additional element has ended, 3713 or if it is t, any additional element has ended,
3585 or if nil, until end of buffer." 3714 or if nil, until end of buffer."
3598 "Parse until (at least) SGML-GOAL. 3727 "Parse until (at least) SGML-GOAL.
3599 Optional argument EXTRA-COND should be a function. This function is 3728 Optional argument EXTRA-COND should be a function. This function is
3600 called in the parser loop, and the loop is exited if the function returns t. 3729 called in the parser loop, and the loop is exited if the function returns t.
3601 If third argument QUIT is non-nil, no \"Parsing...\" message will be displayed." 3730 If third argument QUIT is non-nil, no \"Parsing...\" message will be displayed."
3602 (sgml-need-dtd) 3731 (sgml-need-dtd)
3732
3733 (unless before-change-function
3734 (message "WARN: before-change-function has been lost, restoring (%s)"
3735 (current-buffer))
3736 (setq before-change-function 'sgml-note-change-at)
3737 (setq after-change-function 'sgml-set-face-after-change)
3738 )
3739
3603 (sgml-find-start-point (min sgml-goal (point-max))) 3740 (sgml-find-start-point (min sgml-goal (point-max)))
3604 (assert sgml-current-tree) 3741 (assert sgml-current-tree)
3605 (let ((bigparse (and (not quiet) (> (- sgml-goal (point)) 10000)))) 3742 (let ((bigparse (and (not quiet) (> (- sgml-goal (point)) 10000))))
3606 (when bigparse 3743 (when bigparse
3607 (sgml-message "Parsing...")) 3744 (sgml-message "Parsing..."))
3608 (sgml-with-parser-syntax 3745 (sgml-with-parser-syntax
3609 (sgml-parser-loop extra-cond)) 3746 (sgml-parser-loop extra-cond))
3610 (when bigparse 3747 (when bigparse
3611 (sgml-message "")))) 3748 (sgml-message ""))))
3612 3749
3613 (defun sgml-parse-continue (sgml-goal) 3750 (defun sgml-parse-continue (sgml-goal &optional extra-cond quiet)
3614 "Parse until (at least) SGML-GOAL." 3751 "Parse until (at least) SGML-GOAL."
3615 (assert sgml-current-tree) 3752 (assert sgml-current-tree)
3616 (sgml-message "Parsing...") 3753 (unless quiet
3754 (sgml-message "Parsing..."))
3617 (sgml-with-parser-syntax 3755 (sgml-with-parser-syntax
3618 (sgml-parser-loop nil)) 3756 (sgml-parser-loop extra-cond))
3619 (sgml-message "")) 3757 (unless quiet
3758 (sgml-message "")))
3620 3759
3621 (defun sgml-reparse-buffer (shortref-fun) 3760 (defun sgml-reparse-buffer (shortref-fun)
3622 "Reparse the buffer and let SHORTREF-FUN take care of short references. 3761 "Reparse the buffer and let SHORTREF-FUN take care of short references.
3623 SHORTREF-FUN is called with the entity as argument and `sgml-markup-start' 3762 SHORTREF-FUN is called with the entity as argument and `sgml-markup-start'
3624 pointing to start of short ref and point pointing to the end." 3763 pointing to start of short ref and point pointing to the end."
3703 (eq (point) 3842 (eq (point)
3704 sgml-rs-ignore-pos))) 3843 sgml-rs-ignore-pos)))
3705 ;; Restore position, to consider the delim for S+ or data 3844 ;; Restore position, to consider the delim for S+ or data
3706 (progn (goto-char sgml-markup-start) 3845 (progn (goto-char sgml-markup-start)
3707 nil))) 3846 nil)))
3708 (setq sgml-rs-ignore-pos (point)) 3847 (setq sgml-rs-ignore-pos sgml-markup-start) ; don't reconsider RS
3709 (funcall sgml-shortref-handler tem)) 3848 (funcall sgml-shortref-handler tem))
3710 ((and (not (sgml-current-mixed-p)) 3849 ((and (not (sgml-current-mixed-p))
3711 (sgml-parse-s sgml-current-shortmap))) 3850 (sgml-parse-s sgml-current-shortmap)))
3712 ((or (sgml-parse-delim "ETAGO" gi) 3851 ((or (sgml-parse-delim "ETAGO" gi)
3713 (sgml-is-enabled-net)) 3852 (sgml-is-enabled-net))
3729 (defun sgml-do-start-tag () 3868 (defun sgml-do-start-tag ()
3730 ;; Assume point after STAGO 3869 ;; Assume point after STAGO
3731 (when sgml-throw-on-element-change 3870 (when sgml-throw-on-element-change
3732 (throw sgml-throw-on-element-change 'start)) 3871 (throw sgml-throw-on-element-change 'start))
3733 (setq sgml-conref-flag nil) 3872 (setq sgml-conref-flag nil)
3734 (let (temp net-enabled et asl) 3873 (let (net-enabled et asl)
3735 (setq et (if (sgml-is-delim "TAGC") ; empty start-tag 3874 (setq et (if (sgml-is-delim "TAGC") ; empty start-tag
3736 (sgml-do-empty-start-tag) 3875 (sgml-do-empty-start-tag)
3737 (sgml-lookup-eltype (sgml-check-name)))) 3876 (sgml-lookup-eltype (sgml-check-name))))
3738 (unless (sgml-parse-delim "TAGC") ; optimize common case 3877 (unless (sgml-parse-delim "TAGC") ; optimize common case
3739 (setq asl (sgml-parse-attribute-specification-list et)) 3878 (setq asl (sgml-parse-attribute-specification-list et))
3837 sgml-markup-start sgml-markup-start))) 3976 sgml-markup-start sgml-markup-start)))
3838 (sgml-close-element sgml-markup-start (point))))) 3977 (sgml-close-element sgml-markup-start (point)))))
3839 3978
3840 (defun sgml-is-goal-after-start (goal tree) 3979 (defun sgml-is-goal-after-start (goal tree)
3841 (and tree 3980 (and tree
3842 ;;(not (zerop (sgml-tree-stag-len tree))) 3981 (if (sgml-bpos-p (sgml-tree-stag-epos tree))
3843 (> goal (sgml-element-start tree)))) 3982 (> goal (sgml-tree-stag-epos tree))
3983 (>= goal (sgml-epos-after (sgml-tree-stag-epos tree))))))
3844 3984
3845 (defun sgml-find-start-point (goal) 3985 (defun sgml-find-start-point (goal)
3846 (let ((u sgml-top-tree)) 3986 (let ((u sgml-top-tree))
3847 (while 3987 (while
3848 (cond 3988 (cond
4122 4262
4123 ;;;; Provide 4263 ;;;; Provide
4124 4264
4125 (provide 'psgml-parse) 4265 (provide 'psgml-parse)
4126 4266
4267 ;; Local variables:
4268 ;; byte-compile-warnings:(free-vars unresolved callargs redefine)
4269 ;; End:
4127 ;;; psgml-parse.el ends here 4270 ;;; psgml-parse.el ends here