ocamlspot / command.ml

(***********************************************************************)
(*                                                                     *)
(*                            OCamlSpotter                             *)
(*                                                                     *)
(*                             Jun FURUSE                              *)
(*                                                                     *)
(*   Copyright 2008, 2009, 2010 Jun Furuse. All rights reserved.       *)
(*   This file is distributed under the terms of the GNU Library       *)
(*   General Public License, with the special exception on linking     *)
(*   described in file LICENSE.                                        *)
(*                                                                     *)
(***********************************************************************)

(* escape metacharacters for /bin/sh 

   Backslash quoting the following characters

   According to the manual of /bin/sh:

   metacharacters: |  & ; ( ) < > space tab
   history expansion character: !
   quote characters: \\ \' "" 
*)

(* general escape *)
let escaped pred s =
  let b = Buffer.create (String.length s) in
  String.iter (fun c ->
    if pred c then Buffer.add_char b '\\';
    Buffer.add_char b c) s;
  Buffer.contents b
;;

let escaped_for_shell =
  escaped (function
    | '|' | '&' | ';' | '(' | ')' | '<' | '>' | ' ' | '\t'
    | '!'
    | '\\' | '\'' | '"' -> true
    | _ -> false)
;;

let shell args = 
  Sys.command (String.concat " " (List.map escaped_for_shell args))
;;

   
   
   
   
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.