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 () }