require 'formula'

class JohnJumbo < Formula
  homepage 'http://www.openwall.com/john/'
  url 'http://www.openwall.com/john/g/john-1.7.9.tar.bz2'
  sha1 '8f77bdd42b7cf94ec176f55ea69c4da9b2b8fe3b'
  revision 1

  bottle do
    revision 1
    sha1 "a11eb01effa085f1f196353477111f76c39e6349" => :mavericks
    sha1 "acbdf6c2b4f59b2b4e756d7288f3d727ab630706" => :mountain_lion
    sha1 "eef8dcc88d9666c7c3c099bee4cc6d14f27a056b" => :lion
  end

  conflicts_with 'john', :because => 'both install the same binaries'

  depends_on "openssl"

  patch do
    url "http://www.openwall.com/john/g/john-1.7.9-jumbo-7.diff.gz"
    sha1 "22fd8294e997f45a301cfeb65a8aa7083f25a55d"
  end

  # First patch taken from MacPorts, tells john where to find runtime files
  # Second patch protects against a redefinition of _mm_testz_si128 which
  # tanked the build in clang;
  # see https://github.com/Homebrew/homebrew/issues/26531
  patch :DATA

  fails_with :llvm do
    build 2334
    cause "Don't remember, but adding this to whitelist 2336."
  end

  def install
    ENV.deparallelize
    arch = MacOS.prefer_64_bit? ? "64-opencl" : "sse2-opencl"
    target = "macosx-x86-#{arch}"

    args = %W[-C src clean CC=#{ENV.cc} #{target}]

    if MacOS.version >= :snow_leopard
      case ENV.compiler
      when :clang
        # no openmp support
      when :gcc, :llvm
        args << "OMPFLAGS=-fopenmp -msse2 -D_FORTIFY_SOURCE=0"
      else
        args << "OMPFLAGS=-fopenmp -msse2"
      end
    end

    system "make", *args

    # Remove the README symlink and install the real file
    rm 'README'
    prefix.install 'doc/README'
    doc.install Dir['doc/*']

    # Only symlink the binary into bin
    (share/'john').install Dir['run/*']
    bin.install_symlink share/'john/john'

    # Source code defaults to 'john.ini', so rename
    mv share/'john/john.conf', share/'john/john.ini'
  end
end


__END__
--- a/src/params.h	2012-08-30 13:24:18.000000000 -0500
+++ b/src/params.h	2012-08-30 13:25:13.000000000 -0500
@@ -70,15 +70,15 @@
  * notes above.
  */
 #ifndef JOHN_SYSTEMWIDE
-#define JOHN_SYSTEMWIDE			0
+#define JOHN_SYSTEMWIDE			1
 #endif
 
 #if JOHN_SYSTEMWIDE
 #ifndef JOHN_SYSTEMWIDE_EXEC /* please refer to the notes above */
-#define JOHN_SYSTEMWIDE_EXEC		"/usr/libexec/john"
+#define JOHN_SYSTEMWIDE_EXEC		"HOMEBREW_PREFIX/share/john"
 #endif
 #ifndef JOHN_SYSTEMWIDE_HOME
-#define JOHN_SYSTEMWIDE_HOME		"/usr/share/john"
+#define JOHN_SYSTEMWIDE_HOME		"HOMEBREW_PREFIX/share/john"
 #endif
 #define JOHN_PRIVATE_HOME		"~/.john"
 #endif

diff --git a/src/rawSHA1_ng_fmt.c b/src/rawSHA1_ng_fmt.c
index 5f89cda..6cbd550 100644
--- a/src/rawSHA1_ng_fmt.c
+++ b/src/rawSHA1_ng_fmt.c
@@ -530,7 +530,7 @@ static void sha1_fmt_crypt_all(int count)
 
 #if defined(__SSE4_1__)
 
-# if !defined(__INTEL_COMPILER)
+# if !defined(__INTEL_COMPILER) && !defined(__clang__)
 // This intrinsic is not always available in GCC, so define it here.
 static inline int _mm_testz_si128 (__m128i __M, __m128i __V)
 {
