(* $Id: pxp_lexers.ml 702 2004-08-29 11:35:29Z gerd $ * ---------------------------------------------------------------------- * PXP: The polymorphic XML parser for Objective Caml. * Copyright 1999 by Gerd Stolpmann. See LICENSE for details. *) open Pxp_core_types open Pxp_lexer_types let lexer_factories = Hashtbl.create 100;; class false_factory msg : lexer_factory = object method encoding = `Enc_usascii method open_source _ = failwith msg method open_string _ = failwith msg method open_string_inplace _ = failwith msg end let init ls = Hashtbl.add lexer_factories ls#encoding ls ;; let get_lexer_factory enc = try Hashtbl.find lexer_factories enc with Not_found -> failwith ("Pxp_lexers: This type of internal encoding is not supported: " ^ Netconversion.string_of_encoding (enc :> encoding) ^ " - maybe missing lexing module?") ;; (* The following emulation of get_lexer_set works _only_ for WDialog! * We can assume that get_lexer_set is called every time a new buffer * is to be scanned. Furthermore, we know that the lexbuf was created * with Lexing.from_string. *) open Pxp_reader;; let get_lexer_set (enc : rep_encoding) = (* DEPRECATED *) let enc' = (enc :> encoding) in let factory = get_lexer_factory enc in let old_obj = ref None in let open_obj buf = match !old_obj with None -> let src = { lsrc_lexbuf = lazy buf; lsrc_unicode_lexbuf = lazy(Netulex.ULB.from_string enc' buf.Lexing.lex_buffer) } in let obj = factory # open_source src in old_obj := Some obj; obj | Some obj -> obj in let scan_name_string buf = let lobj = open_obj buf in lobj # scan_name_string() in { scan_name_string = scan_name_string } ;;