Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
(* Préprocesseur C *)
{
open Lexing
open Printf
(* La table de hachage [definitions] contient les macros définies (elle
associe à chaque macro sa valeur) *)
let definitions = Hashtbl.create 97
let define = Hashtbl.add definitions
let defined = Hashtbl.mem definitions
let definition = Hashtbl.find definitions
}
let space = [' ' '\t']
let letter = ['a'-'z' 'A'-'Z']
let ident = letter+
(* la fonction [scan] préprocesse le texte *)
rule scan = parse
| "#define" space+ (ident as x) space* ([^'\n']* as v) '\n'
{ define x v; scan lexbuf }
| "#ifdef" space+ (ident as x) space* '\n'
{ if defined x then scan lexbuf else skip lexbuf }
| "#else" space* '\n'
{ skip lexbuf }
| "#endif" space* '\n'
{ scan lexbuf }
| "/*"
{ printf "/*"; comment lexbuf; scan lexbuf }
| "\"" ([^'"' '\\'] | '\\' _)* "\"" as s
{ printf "%s" s; scan lexbuf }
| ident as x
{ printf "%s" (if defined x then definition x else x); scan lexbuf }
| _ as c
{ printf "%c" c; scan lexbuf }
| eof
{ () }
(* la fonction [skip] ignore le texte jusqu'à la première occurrence de #else
ou de #endif (mais elle prend en compte les #ifdef imbriqués), puis relance
la fonction [scan] *)
and skip = parse
| ("#else" | "#endif") space* '\n'
{ scan lexbuf }
| "#ifdef" space+ ident space* '\n'
{ skip_to_endif lexbuf; skip lexbuf }
| _
{ skip lexbuf }
| eof
{ () }
(* la fonction [skip_to_endif] ignore le texte jusqu'à la première occurrence
de #endif (sans se soucier de #else, mais en prenant en compte les #ifdef
imbriqués) *)
and skip_to_endif = parse
| "#endif" space* '\n'
{ () }
| "#ifdef" space+ ident space* '\n'
{ skip_to_endif lexbuf; skip_to_endif lexbuf }
| _
{ skip_to_endif lexbuf }
| eof
{ () }
(* lit (et copie tel quel) jusqu'à une fin de commentaire *)
and comment = parse
| "*/" { printf "*/" }
| _ as c { printf "%c" c; comment lexbuf }
| eof { () }
{
let usage () = eprintf "usage: cpp file\n"; exit 1
(* on crée le buffer d'analyse lexicale à partir du fichier sur la ligne
de commande et on lui applique la fonction [scan] *)
let main () =
if Array.length Sys.argv <> 2 then usage ();
let c = open_in Sys.argv.(1) in
let lb = from_channel c in
scan lb;
close_in c
let _ = Printexc.catch main ()
}