public static void main()

in pdq/java/src/main/java/pdqhashing/tools/PDQPhotoHasherTool.java [54:160]


  public static void main(String[] args) {
    boolean filesOnStdin = false;
    boolean doPDQHash = true;
    boolean doPDQDih = false;
    boolean doPDQDihAcross = false;
    boolean doDetailedOutput = false;
    boolean doTimings = true;
    boolean keepGoingAfterErrors = false;

    // Parse command-line flags. I'm explicitly not using gflags or other such
    // libraries, to minimize the number of external dependencies for this
    // project.
    int argi = 0;
    int argc = args.length;
    for (argi = 0; argi < argc; argi++) {
      if (!args[argi].startsWith("-")) {
        break;
      }

      if (args[argi].equals("-h") || args[argi].equals("--help")) {
        usage(0);

      } else if (args[argi].equals("-i") || args[argi].equals("--files-on-stdin")) {
        filesOnStdin  = true;
        continue;

      } else if (args[argi].equals("-d") || args[argi].equals("--details")) {
        doDetailedOutput  = true;
        continue;

      } else if (args[argi].equals("--no-timings")) {
        doTimings  = false;
        continue;

      } else if (args[argi].equals("--pdq")) {
        doPDQHash = true;
        doPDQDih  = false;
        continue;

      } else if (args[argi].equals("--pdqdih")) {
        doPDQHash = false;
        doPDQDih = true;
        doPDQDihAcross = false;
        continue;

      } else if (args[argi].equals("--pdqdih-across")) {
        doPDQHash = false;
        doPDQDih = true;
        doPDQDihAcross = true;
        continue;

      } else if (args[argi].equals("-k")) {
        keepGoingAfterErrors = true;
        continue;

      } else {
        usage(1);
      }
    }

    PDQHasher pdqHasher = new PDQHasher();

    Context context = new Context(
      0, // numPDQHash
      null, // pdqHashPrev
      false); // hadError

    // Iterate over image-file names.  One file at a time, compute per-file hash
    // and hamming distance to previous. (E.g. for video frame-taps).
    if (filesOnStdin) {
      if (argi < argc) {
        usage(1);
      }

      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
      String filename = null;
      int lno = 1;
      try {
        while ((filename = reader.readLine()) != null) { // In Java, line-terminators already stripped for us
          lno++;
          context.numPDQHash++;
          processFile(pdqHasher, filename, doPDQHash, doPDQDih, doPDQDihAcross,
            doDetailedOutput, doTimings, keepGoingAfterErrors, context);
          System.out.flush();
        }
      } catch (IOException e) {
        System.err.printf("Couldn't read line %d of standard input.\n", lno);
        System.exit(1);
      }
    } else {
      if (argi >= argc) {
        usage(1);
      }
      for ( ; argi < argc; argi++) {
        String filename = args[argi];
        context.numPDQHash++;
        processFile(pdqHasher, filename, doPDQHash, doPDQDih, doPDQDihAcross,
          doDetailedOutput, doTimings, keepGoingAfterErrors, context);
        System.out.flush();
      }
    }

    if (context.hadError) {
      System.exit(1);
    }

  }